All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dakusui.valid8j_pcond.fluent.Statement Maven / Gradle / Ivy

The newest version!
package com.github.dakusui.valid8j_pcond.fluent;

import com.github.dakusui.valid8j_pcond.core.fluent.builtins.*;

import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
import java.util.stream.Stream;

import static com.github.dakusui.valid8j_pcond.forms.Functions.elementAt;
import static com.github.dakusui.valid8j_pcond.forms.Predicates.allOf;
import static com.github.dakusui.valid8j_pcond.forms.Predicates.transform;
import static com.github.dakusui.valid8j_pcond.internals.InternalUtils.makeSquashable;

@FunctionalInterface
public interface Statement {
  default T statementValue() {
    throw new NoSuchElementException();
  }

  Predicate statementPredicate();

  /**
   * Returns a transformer for a `String` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see StringTransformer
   */
  static StringTransformer
  stringValue(String value) {
    return StringTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `double` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see DoubleTransformer
   */
  static DoubleTransformer
  doubleValue(Double value) {
    return DoubleTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `float` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see FloatTransformer
   */
  static FloatTransformer
  floatValue(Float value) {
    return FloatTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `long` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see LongTransformer
   */
  static LongTransformer
  longValue(Long value) {
    return LongTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `int` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see IntegerTransformer
   */
  static IntegerTransformer
  integerValue(Integer value) {
    return IntegerTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `short` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see ShortTransformer
   */
  static ShortTransformer
  shortValue(Short value) {
    return ShortTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `boolean` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see BooleanTransformer
   */
  static BooleanTransformer
  booleanValue(Boolean value) {
    return BooleanTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a general `Object` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see ObjectTransformer
   */
  static 
  ObjectTransformer
  objectValue(E value) {
    return ObjectTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `List` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see ListTransformer
   */

  static 
  ListTransformer, E>
  listValue(List value) {
    return ListTransformer.create(() -> value);
  }

  /**
   * Returns a transformer for a `Stream` value.
   *
   * @param value A value for which a transformer is created.
   * @return A transformer for a {@code value}.
   * @see StreamTransformer
   */
  static 
  StreamTransformer, E>
  streamValue(Stream value) {
    return StreamTransformer.create(() -> value);
  }

  static Predicate> createPredicateForAllOf(Statement[] statements) {
    AtomicInteger i = new AtomicInteger(0);
    @SuppressWarnings("unchecked") Predicate>[] predicates = Arrays.stream(statements)
        .map(e -> makeSquashable(transform(elementAt(i.getAndIncrement())).check("WHEN", (Predicate) e.statementPredicate())))
        .toArray(Predicate[]::new);
    return makeSquashable(allOf(predicates));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy