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

com.github.dakusui.crest.utils.printable.Functions Maven / Gradle / Ivy

package com.github.dakusui.crest.utils.printable;

import com.github.dakusui.crest.utils.InternalUtils;

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

import static com.github.dakusui.crest.utils.InternalUtils.summarize;
import static java.util.Objects.requireNonNull;

public enum Functions {
  ;

  public static final Object THIS = new Object() {
    public String toString() {
      return "(THIS)";
    }
  };

  public static  Function identity() {
    return Printable.function(
        "->identity",
        Function.identity()
    );
  }

  public static  Function stringify() {
    return Printable.function(
        "->stringify",
        Object::toString
    );
  }

  public static Function length() {
    return Printable.function(
        "->length",
        String::length
    );
  }

  public static  Function, ? extends E> elementAt(int i) {
    return Printable.function(
        () -> String.format("->at[%s]", i),
        es -> (E) es.get(i)
    );
  }

  public static Function, Integer> size() {
    return Printable.function(
        "->size",
        Collection::size
    );
  }

  public static  Function, Stream> stream() {
    return Printable.function(
        "->stream",
        Collection::stream
    );
  }

  public static  Function cast(Class type) {
    return Printable.function(
        () -> String.format("->castTo[%s]", requireNonNull(type).getSimpleName()),
        type::cast
    );
  }

  public static , E> Function> collectionToList() {
    return Printable.function("->collectionToList", (I c) -> new LinkedList() {
      {
        addAll(c);
      }
    });
  }

  public static  Function> arrayToList() {
    return Printable.function("->arrayToList", Arrays::asList);
  }

  public static Function countLines() {
    return Printable.function("->countLines", (String s) -> s.split("\n").length);
  }

  public static  Function invoke(String methodName, Object... args) {
    return invokeOn(THIS, methodName, args);
  }

  public static  Function invokeOn(Object on, String methodName, Object... args) {
    return Printable.function(
        on == THIS
            ? () -> String.format(".%s%s", methodName, summarize(args))
            : () -> String.format("->%s.%s%s", on, methodName, summarize(args)),
        (I target) -> InternalUtils.invokeMethod(
            InternalUtils.replaceTarget(on, target),
            methodName,
            args
        ));
  }

  public static  Function invokeStatic(Class klass, String methodName, Object... args) {
    return Printable.function(
        () -> String.format("->%s.%s%s", klass.getSimpleName(), methodName, summarize(args)),
        (I target) -> InternalUtils.invokeStaticMethod(
            klass,
            target,
            methodName,
            args
        ));
  }

  public static  TrivialFunction trivial(Function function) {
    return TrivialFunction.create(function);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy