diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Do.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Do.java new file mode 100644 index 000000000..3ab297e2d --- /dev/null +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Do.java @@ -0,0 +1,64 @@ +package com.dfsek.terra.addons.manifest.api.monad; + +import io.vavr.Function1; +import io.vavr.Function2; +import io.vavr.Function3; +import io.vavr.Function4; + +import com.dfsek.terra.api.util.function.monad.Monad; + + +public final class Do { + private Do() { + + } + + public static > Monad with(Monad monad) { + return monad; + } + + public static > Monad with(Monad monad, + Function1> bind) { + return monad + .bind(bind); + } + + public static > Monad with(Monad monad, + Function1> bind, + Function2> bind2) { + return monad + .bind(t -> monad + .bind(bind) + .bind(bind2.apply(t))); + } + + public static > Monad with(Monad monad, + Function1> bind, + Function2> bind2, + Function3> bind3) { + return monad + .bind(t -> monad + .bind(bind) + .bind(u -> bind2.apply(t) + .andThen(vmMonad -> vmMonad + .bind(bind3.apply(t, u))) + .apply(u))); + } + + public static > Monad with(Monad monad, + Function1> bind, + Function2> bind2, + Function3> bind3, + Function4> bind4) { + return monad + .bind(t -> monad + .bind(bind) + .bind(u -> bind2.apply(t) + .andThen(vmMonad -> vmMonad + .bind(v -> bind3.apply(t, u) + .andThen(wmMonad -> wmMonad + .bind(bind4.apply(t, u, v))) + .apply(v))) + .apply(u))); + } +}