mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-14 03:36:03 +00:00
update most things to use new maybe and either
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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<>();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user