From f03f39f1d7d245ade29bb8c0876c8a0b9e92f11b Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 17:05:18 -0700 Subject: [PATCH] implement Monad (Maybe a) --- .../terra/api/util/generic/control/Monad.java | 4 +-- .../api/util/generic/data/types/Maybe.java | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) 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 index dda469b54..29ae017c0 100644 --- 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 @@ -10,9 +10,9 @@ 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 bind(Function> map); - > Monad pure(T1 t); + Monad pure(T1 t); @Override default Monad map(Function map) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 5973ef04c..5bce277fe 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -6,19 +6,44 @@ import java.util.Optional; import java.util.function.Function; -public interface Maybe{ +public interface Maybe extends Monad> { + @Override + default Maybe pure(T1 t) { + return just(t); + } + + @Override + Maybe bind(Function>> map); Optional toOptional(); + static Maybe just(T1 t) { + return new Just<>(t); + } + + static Maybe nothing() { + return new Nothing<>(); + } + record Just(T value) implements Maybe { @Override public Optional toOptional() { return Optional.of(value); } + + @Override + public Maybe bind(Function>> map) { + return (Maybe) map.apply(value); + } } record Nothing() implements Maybe { + @Override + public Maybe bind(Function>> map) { + return nothing(); + } + @Override public Optional toOptional() { return Optional.empty();