Implement Monad Lazy

This commit is contained in:
dfsek
2026-01-02 17:12:30 -07:00
parent a5fe4d7928
commit a66c2a0749

View File

@@ -7,13 +7,21 @@
package com.dfsek.terra.api.util.generic;
import com.dfsek.terra.api.util.generic.control.Monad;
import com.dfsek.terra.api.util.generic.data.Functor;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.function.Supplier;
public final class Lazy<T> {
public final class Lazy<T> implements Monad<T, Lazy<?>> {
private final Supplier<T> valueSupplier;
private T value;
private boolean got = false;
private volatile T value = null;
private final AtomicBoolean got = new AtomicBoolean(false);
private Lazy(Supplier<T> valueSupplier) {
this.valueSupplier = valueSupplier;
@@ -24,10 +32,24 @@ public final class Lazy<T> {
}
public T value() {
if(!got && value == null) {
got = true;
if(!got.compareAndExchange(false, true)) {
value = valueSupplier.get();
}
return value;
}
@Override
public @NotNull <T2> Lazy<T2> bind(@NotNull Function<T, Monad<T2, Lazy<?>>> map) {
return lazy(() -> ((Lazy<T2>) map.apply(value())).value());
}
@Override
public @NotNull <U> Lazy<U> map(@NotNull Function<T, U> map) {
return (Lazy<U>) Monad.super.map(map);
}
@Override
public @NotNull <T1> Lazy<T1> pure(@NotNull T1 t) {
return new Lazy<>(() -> t);
}
}