diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java new file mode 100644 index 000000000..20b1ac720 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.function.Function; + + +public interface Applicative> extends Functor { + > Applicative pure(U t); + + > Applicative apply(K> amap); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java index 4e3cb27bf..ca67b235c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java @@ -3,6 +3,6 @@ package com.dfsek.terra.api.util.generic; import java.util.function.Function; -public interface Functor> { - Functor map(Function map); +public interface Functor { + Functor map(Function map); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java new file mode 100644 index 000000000..23a621813 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.util.generic; + +/** + * Kind + */ +public interface K { + @SuppressWarnings("unchecked") + default T self() { + return (T) this; + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java index 61da29860..5b2b54c80 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java @@ -1,10 +1,27 @@ package com.dfsek.terra.api.util.generic; import java.util.Optional; +import java.util.function.Function; -public interface Maybe { +public interface Maybe extends Monad> { + @Override + Maybe bind(Function>> map); + + @Override + Maybe identity(); + + @Override + Maybe map(Function map); + + @Override + Monad> multiply(Maybe t); + default Optional toOptional() { } + + record Just(T value) implements Maybe { + + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java index fab00529a..829c7cf30 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java @@ -6,12 +6,24 @@ import java.util.function.Function; /** * A monad is a monoid in the category of endofunctors. */ -public interface Monad> extends Functor, Monoid { - Monad bind(Function> map); - Monad pure(T2 t); +public interface Monad> extends Applicative, Monoid{ + > Monad bind(Function> map); + @Override + > Monad identity(); @Override - default Monad map(Function map) { + > Monad pure(U t); + + @Override + Monad multiply(M t); + + @Override + default > Monad map(Function map) { return bind(m -> pure(map.apply(m))); } + + @Override + default > Monad apply(K> amap) { + amap.self() + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java index cee923ded..e92727064 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.util.generic; -public interface Monoid> extends Semigroup{ - Monoid pure(T1 t); +public interface Monoid> extends Semigroup{ + > Monoid identity(); @Override Monoid multiply(M t); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java index 19acd0465..56748b937 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java @@ -1,5 +1,5 @@ package com.dfsek.terra.api.util.generic; -public interface Semigroup> { +public interface Semigroup> { Semigroup multiply(S t); }