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

com.github.dakusui.valid8j_pcond.experimentals.currying.context.CurriedContextUtils Maven / Gradle / Ivy

The newest version!
package com.github.dakusui.valid8j_pcond.experimentals.currying.context;

import com.github.dakusui.valid8j_pcond.experimentals.currying.CurriedFunction;
import com.github.dakusui.valid8j_pcond.experimentals.currying.CurryingUtils;
import com.github.dakusui.valid8j_pcond.core.printable.PrintablePredicateFactory;
import com.github.dakusui.valid8j_pcond.forms.Predicates;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

import static java.util.Arrays.asList;
import static java.util.Objects.requireNonNull;

/**
 * A utility class that collects helper methods for the "Context" mechanism.
 */
public enum CurriedContextUtils {
  ;

  public static Stream nest(Stream stream, Collection inner) {
    return toCurriedContextStream(stream)
        .flatMap((CurriedContext curriedContext) -> inner
            .stream()
            .map((Function) curriedContext::append));
  }

  public static Stream toCurriedContextStream(Stream stream) {
    return stream.map(CurriedContextUtils::toCurriedContext);
  }

  public static  CurriedContext toCurriedContext(T t) {
    return t instanceof CurriedContext ? (CurriedContext) t : CurriedContext.from(t);
  }

  public static  Predicate applyAndTest(CurriedFunction curriedFunction, Predicate pred, @SuppressWarnings("SameParameterValue") Class type, int... orderArgs) {
    List spec = asList(curriedFunction, pred, asList(Arrays.stream(orderArgs).boxed().toArray()));
    return PrintablePredicateFactory.parameterizedLeaf(
        args -> () -> String.format("%s(%s%s)", args.get(1), args.get(0), args.get(2)), args -> (CurriedContext curriedContext) -> (pred).test(type.cast(CurryingUtils.applyCurriedFunction(curriedFunction, orderArgs).apply(curriedContext))), spec, CurriedContextUtils.class
    );
  }

  public static Predicate toContextPredicate(CurriedFunction curriedFunction, int... orderArgs) {
    return CurriedContextUtils.applyAndTest(curriedFunction, createPredicate("curry", Predicates.isTrue()), Boolean.class, orderArgs);
  }

  public static  Predicate createPredicate(String s, Predicate predicate) {
    requireNonNull(s);
    return PrintablePredicateFactory.leaf(() -> s, predicate, CurriedContextUtils.class);
  }
}