diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index ad9fa94c9..795f136d1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -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.Pair; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.Objects; +import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -56,7 +59,28 @@ public final class FunctionUtils { }; } - public static T construct(Supplier in) { - return in.get(); + @Contract(pure = true, value = "_ -> new") + public static @NotNull Function, R> tuple(@NotNull BiFunction f) { + return p -> f.apply(p.left(), p.right()); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull BiFunction untuple(@NotNull Function, R> f) { + return (a, b) -> f.apply(Pair.of(a, b)); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull Function> curry(@NotNull BiFunction f) { + return a -> b -> f.apply(a, b); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull BiFunction uncurry(@NotNull Function> f) { + return (a, b) -> f.apply(a).apply(b); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull T construct(@NotNull Supplier in) { + return Objects.requireNonNull(Objects.requireNonNull(in).get()); } }