mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 02:20:57 +00:00
add curry and uncurry functions
This commit is contained in:
@@ -2,10 +2,13 @@ package com.dfsek.terra.api.util.function;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.util.generic.data.types.Either;
|
import com.dfsek.terra.api.util.generic.data.types.Either;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.generic.data.types.Pair;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Contract;
|
import org.jetbrains.annotations.Contract;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@@ -56,7 +59,28 @@ public final class FunctionUtils {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> T construct(Supplier<T> in) {
|
@Contract(pure = true, value = "_ -> new")
|
||||||
return in.get();
|
public static <T, U, R> @NotNull Function<Pair<T, U>, R> tuple(@NotNull BiFunction<T, U, R> f) {
|
||||||
|
return p -> f.apply(p.left(), p.right());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Contract(pure = true, value = "_ -> new")
|
||||||
|
public static <T, U, R> @NotNull BiFunction<T, U, R> untuple(@NotNull Function<Pair<T, U>, R> f) {
|
||||||
|
return (a, b) -> f.apply(Pair.of(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Contract(pure = true, value = "_ -> new")
|
||||||
|
public static <T, U, R> @NotNull Function<T, Function<U, R>> curry(@NotNull BiFunction<T, U, R> f) {
|
||||||
|
return a -> b -> f.apply(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Contract(pure = true, value = "_ -> new")
|
||||||
|
public static <T, U, R> @NotNull BiFunction<T, U, R> uncurry(@NotNull Function<T, Function<U, R>> f) {
|
||||||
|
return (a, b) -> f.apply(a).apply(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Contract(pure = true, value = "_ -> new")
|
||||||
|
public static <T> @NotNull T construct(@NotNull Supplier<T> in) {
|
||||||
|
return Objects.requireNonNull(Objects.requireNonNull(in).get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user