update most things to use new maybe and either

This commit is contained in:
dfsek
2025-12-29 18:59:57 -07:00
parent d52cd0d7cf
commit 16705057e0
11 changed files with 155 additions and 91 deletions

View File

@@ -22,6 +22,10 @@ public final class FunctionUtils {
return (Either<L, T>) o.map(Either::right).orElseGet(() -> Either.left(de));
}
public static <T> T collapse(Either<T, T> either) {
return either.collect(Function.identity(), Function.identity());
}
public static <T, U> Function<T, Either<Exception, U>> liftTry(Function<T, U> f) {
return s -> {
try {

View File

@@ -4,7 +4,9 @@ import com.dfsek.terra.api.util.generic.control.Monad;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Stream;
public interface Maybe<T> extends Monad<T, Maybe<?>> {
@@ -21,6 +23,11 @@ public interface Maybe<T> extends Monad<T, Maybe<?>> {
<L> Either<L, T> toEither(L l);
T get(Supplier<T> def);
boolean isJust();
@Override
<U> Maybe<U> map(Function<T, U> map);
default T get(T def) {
return get(() -> def);
}
@@ -29,6 +36,24 @@ public interface Maybe<T> extends Monad<T, Maybe<?>> {
return bind(ignore -> m);
}
Maybe<T> or(Supplier<Maybe<T>> or);
default Maybe<T> or(Maybe<T> or) {
return or(() -> or);
}
default Stream<T> toStream() {
return map(Stream::of).get(Stream.empty());
}
default Maybe<T> filter(Predicate<T> filter) {
return bind(o -> filter.test(o) ? this : nothing());
}
static <T> Maybe<T> fromOptional(Optional<T> op) {
return op.map(Maybe::just).orElseGet(Maybe::nothing);
}
static <T1> Maybe<T1> just(T1 t) {
record Just<T>(T value) implements Maybe<T> {
@@ -47,6 +72,21 @@ public interface Maybe<T> extends Monad<T, Maybe<?>> {
return value;
}
@Override
public boolean isJust() {
return true;
}
@Override
public <U> Maybe<U> map(Function<T, U> map) {
return just(map.apply(value));
}
@Override
public Maybe<T> or(Supplier<Maybe<T>> or) {
return this;
}
@Override
public <T2> Maybe<T2> bind(Function<T, Monad<T2, Maybe<?>>> map) {
return (Maybe<T2>) map.apply(value);
@@ -77,6 +117,22 @@ public interface Maybe<T> extends Monad<T, Maybe<?>> {
public T get(Supplier<T> def) {
return def.get();
}
@Override
public boolean isJust() {
return false;
}
@Override
@SuppressWarnings("unchecked")
public <U> Maybe<U> map(Function<T, U> map) {
return (Maybe<U>) this;
}
@Override
public Maybe<T> or(Supplier<Maybe<T>> or) {
return or.get();
}
}
return new Nothing<>();
}

View File

@@ -9,6 +9,9 @@ package com.dfsek.terra.api.world.biome.generation;
import com.dfsek.seismic.type.vector.Vector3;
import com.dfsek.seismic.type.vector.Vector3Int;
import com.dfsek.terra.api.util.generic.data.types.Maybe;
import org.jetbrains.annotations.Contract;
import java.util.Optional;
@@ -64,8 +67,8 @@ public interface BiomeProvider {
return getBiome(vector3.getX(), vector3.getY(), vector3.getZ(), seed);
}
default Optional<Biome> getBaseBiome(int x, int z, long seed) {
return Optional.empty();
default Maybe<Biome> getBaseBiome(int x, int z, long seed) {
return Maybe.nothing();
}

View File

@@ -1,5 +1,7 @@
package com.dfsek.terra.api.world.biome.generation;
import com.dfsek.terra.api.util.generic.data.types.Maybe;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.github.benmanes.caffeine.cache.Scheduler;
@@ -25,14 +27,14 @@ public class CachingBiomeProvider implements BiomeProvider, Handle {
protected final BiomeProvider delegate;
private final int res;
private final ThreadLocal<Pair.Mutable<SeededVector3Key, LoadingCache<SeededVector3Key, Biome>>> cache;
private final ThreadLocal<Pair.Mutable<SeededVector2Key, LoadingCache<SeededVector2Key, Optional<Biome>>>> baseCache;
private final ThreadLocal<Pair.Mutable<SeededVector2Key, LoadingCache<SeededVector2Key, Maybe<Biome>>>> baseCache;
protected CachingBiomeProvider(BiomeProvider delegate) {
this.delegate = delegate;
this.res = delegate.resolution();
this.baseCache = ThreadLocal.withInitial(() -> {
LoadingCache<SeededVector2Key, Optional<Biome>> cache = Caffeine
LoadingCache<SeededVector2Key, Maybe<Biome>> cache = Caffeine
.newBuilder()
.executor(CACHE_EXECUTOR)
.scheduler(Scheduler.systemScheduler())
@@ -56,7 +58,7 @@ public class CachingBiomeProvider implements BiomeProvider, Handle {
}
private Optional<Biome> sampleBiome(SeededVector2Key vec) {
private Maybe<Biome> sampleBiome(SeededVector2Key vec) {
this.baseCache.get().setLeft(new SeededVector2Key(0, 0, 0));
return this.delegate.getBaseBiome(vec.x * res, vec.z * res, vec.seed);
}
@@ -80,8 +82,8 @@ public class CachingBiomeProvider implements BiomeProvider, Handle {
}
@Override
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
Mutable<SeededVector2Key, LoadingCache<SeededVector2Key, Optional<Biome>>> cachePair = baseCache.get();
public Maybe<Biome> getBaseBiome(int x, int z, long seed) {
Mutable<SeededVector2Key, LoadingCache<SeededVector2Key, Maybe<Biome>>> cachePair = baseCache.get();
SeededVector2Key mutableKey = cachePair.getLeft();
mutableKey.set(x, z, seed);
return cachePair.getRight().get(mutableKey);