Skip to content

Instantly share code, notes, and snippets.

@stefanofago73
Created March 29, 2025 16:37
Show Gist options
  • Select an option

  • Save stefanofago73/c733e327ff603f0bb1bcf536aa63591f to your computer and use it in GitHub Desktop.

Select an option

Save stefanofago73/c733e327ff603f0bb1bcf536aa63591f to your computer and use it in GitHub Desktop.
A possible, minimal, Java Optional CoMonad implementation
import java.util.Optional;
import java.util.function.Function;
public final class OptionalCoMonad<T> {
private final Optional<T> value;
private OptionalCoMonad(Optional<T> value) {
this.value = value;
}
public static final <R> OptionalCoMonad<R> Of(Optional<R> value) {
return new OptionalCoMonad<R>(value == null ? Optional.empty() : value);
}
public T extract() {
return value.orElse(null);
}
public <R> OptionalCoMonad<R> extend(Function<Optional<T>, R> func) {
Optional<R> newValue = func == null ?
Optional.empty() :
Optional.ofNullable(func.apply(value));
return new OptionalCoMonad<>(newValue);
}
public Optional<T> get() {
return value;
}
public static void main(String[] args) {
OptionalCoMonad<Integer> coMonad = OptionalCoMonad.Of(Optional.of(10));
OptionalCoMonad<Integer> extended = coMonad.extend(opt -> opt.orElse(0) * 2);
System.out.println(extended.get()); // Output: Optional[20]
System.out.println(coMonad.extract()); // Output: 10
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment