diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java index d29e7d86c..1799f0fc1 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java @@ -2,7 +2,7 @@ package com.dfsek.terra.addons.commands.locate; import com.dfsek.seismic.type.vector.Vector2Int; import com.dfsek.seismic.type.vector.Vector3Int; -import com.dfsek.terra.api.util.generic.either.Either; +import com.dfsek.terra.api.util.generic.data.types.Either; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java index 159b12957..3d6d86358 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java @@ -21,7 +21,7 @@ import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.util.generic.either.Either; +import com.dfsek.terra.api.util.generic.data.types.Either; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.Biome; 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 5d47a73a1..3e25463d0 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 @@ -1,6 +1,6 @@ package com.dfsek.terra.api.util.function; -import com.dfsek.terra.api.util.generic.either.Either; +import com.dfsek.terra.api.util.generic.data.types.Either; import java.util.Optional; import java.util.function.Consumer; 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 deleted file mode 100644 index 0a9a2e602..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - -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 deleted file mode 100644 index ca67b235c..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import java.util.function.Function; - - -public interface Functor { - Functor map(Function map); -} 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 deleted file mode 100644 index c1429c69f..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - -import java.util.function.Function; - - -/** - * A monad is a monoid in the category of endofunctors. - */ -public interface Monad> extends Applicative, Monoid{ - > Monad bind(Function> map); - @Override - > Monad identity(); - - @Override - > 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 deleted file mode 100644 index 36d0a8277..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - - -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 deleted file mode 100644 index a3e089316..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - - -public interface Semigroup> { - Semigroup multiply(S t); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java new file mode 100644 index 000000000..dda469b54 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.util.generic.control; + +import com.dfsek.terra.api.util.generic.data.Functor; +import com.dfsek.terra.api.util.generic.kinds.K; + +import java.util.function.Function; + + +/** + * A monad is a monoid in the category of endofunctors. + */ +public interface Monad> extends Functor, K { + > Monad bind(Function> map); + + > Monad pure(T1 t); + + @Override + default Monad map(Function map) { + return bind(map.andThen(this::pure)); + } + + // almost all well-known applicative functors are also monads, so we can just put that here. + default Monad apply(Monad, M> amap) { + return amap.bind(this::map); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java new file mode 100644 index 000000000..452f1ea85 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.kinds.K; + +import java.util.function.Function; + + +public interface Functor> extends K { + Functor map(Function map); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java new file mode 100644 index 000000000..7725067b8 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.kinds.K; + + +public interface Monoid> extends Semigroup, K{ + > Monoid identity(); + + @Override + Monoid multiply(M t); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java new file mode 100644 index 000000000..26ec7f36f --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.kinds.K; + + +public interface Semigroup> extends K { + Semigroup multiply(S t); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java similarity index 98% rename from common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 3fce7ce21..95a44e31a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -5,7 +5,7 @@ * reference the LICENSE file in the common/api directory. */ -package com.dfsek.terra.api.util.generic.either; +package com.dfsek.terra.api.util.generic.data.types; import com.dfsek.terra.api.util.function.FunctionUtils; 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/data/types/Maybe.java similarity index 81% rename from common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 5b2b54c80..a639e34d1 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/data/types/Maybe.java @@ -1,4 +1,6 @@ -package com.dfsek.terra.api.util.generic; +package com.dfsek.terra.api.util.generic.data.types; + +import com.dfsek.terra.api.util.generic.control.Monad; import java.util.Optional; import java.util.function.Function; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java index f770931c8..7b89b0e1f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.util.generic.kinds; /** - * Kind + * Kind of the type T */ public interface K { @SuppressWarnings("unchecked")