Remove util/fp from project.
This commit is contained in:
parent
869bef51dd
commit
50b04d9c2c
@ -1,31 +0,0 @@
|
||||
plugins {
|
||||
id 'groowt-conventions'
|
||||
id 'groowt-publish'
|
||||
id 'java-library'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api libs.groovy
|
||||
compileOnlyApi libs.jetbrains.anotations
|
||||
}
|
||||
|
||||
java {
|
||||
withSourcesJar()
|
||||
}
|
||||
|
||||
jar {
|
||||
archiveBaseName = 'groowt-util-fp'
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
create('fp', MavenPublication) {
|
||||
artifactId = 'util-fp'
|
||||
from components.java
|
||||
}
|
||||
}
|
||||
}
|
@ -1,90 +0,0 @@
|
||||
package groowt.util.fp.either;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
public sealed interface Either<E, T> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static <E, T> Either<E, T> left(E error) {
|
||||
return (Either<E, T>) new Left<>(error);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static <E, T> Either<E, T> right(T item) {
|
||||
return (Either<E, T>) new Right<>(item);
|
||||
}
|
||||
|
||||
final class Left<E> implements Either<E, Object> {
|
||||
|
||||
private final E error;
|
||||
|
||||
public Left(E error) {
|
||||
this.error = error;
|
||||
}
|
||||
|
||||
public E get() {
|
||||
return this.error;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
final class Right<T> implements Either<Object, T> {
|
||||
|
||||
private final T item;
|
||||
|
||||
public Right(T item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public T get() {
|
||||
return this.item;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
default boolean isLeft() {
|
||||
return this instanceof Either.Left;
|
||||
}
|
||||
|
||||
default boolean isRight() {
|
||||
return this instanceof Either.Right;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default Left<E> asLeft() {
|
||||
return (Left<E>) this;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default Right<T> asRight() {
|
||||
return (Right<T>) this;
|
||||
}
|
||||
|
||||
default E getLeft() {
|
||||
return this.asLeft().get();
|
||||
}
|
||||
|
||||
default T getRight() {
|
||||
return this.asRight().get();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default Either<E, T> mapLeft(Function<? super E, ? extends T> onLeft) {
|
||||
if (this.isLeft()) {
|
||||
return (Either<E, T>) new Right<>(onLeft.apply(this.getLeft()));
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default Either<E, T> flatMapLeft(Function<? super E, Either<E, ? extends T>> onLeft) {
|
||||
if (this.isLeft()) {
|
||||
final var error = this.getLeft();
|
||||
return (Either<E, T>) onLeft.apply(error);
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
package groowt.util.fp.hkt;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public final class Monoid<T> {
|
||||
|
||||
private final SemiGroup<T> semiGroup;
|
||||
private final Zero<T> zero;
|
||||
|
||||
public Monoid(SemiGroup<T> semiGroup, Zero<T> zero) {
|
||||
this.semiGroup = Objects.requireNonNull(semiGroup);
|
||||
this.zero = Objects.requireNonNull(zero);
|
||||
}
|
||||
|
||||
public SemiGroup<T> getSemiGroup() {
|
||||
return this.semiGroup;
|
||||
}
|
||||
|
||||
public Zero<T> getZero() {
|
||||
return this.zero;
|
||||
}
|
||||
|
||||
public T concat(T left, T right) {
|
||||
return this.semiGroup.concat(left, right);
|
||||
}
|
||||
|
||||
public T empty() {
|
||||
return this.zero.getEmpty();
|
||||
}
|
||||
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
package groowt.util.fp.hkt;
|
||||
|
||||
import java.util.function.BinaryOperator;
|
||||
|
||||
public final class SemiGroup<T> {
|
||||
|
||||
private final BinaryOperator<T> concat;
|
||||
|
||||
public SemiGroup(BinaryOperator<T> concat) {
|
||||
this.concat = concat;
|
||||
}
|
||||
|
||||
public T concat(T left, T right) {
|
||||
return this.concat.apply(left, right);
|
||||
}
|
||||
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
package groowt.util.fp.hkt;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public final class Zero<T> {
|
||||
|
||||
private final T empty;
|
||||
|
||||
public Zero(T empty) {
|
||||
this.empty = Objects.requireNonNull(empty);
|
||||
}
|
||||
|
||||
public T getEmpty() {
|
||||
return this.empty;
|
||||
}
|
||||
|
||||
}
|
@ -1,159 +0,0 @@
|
||||
package groowt.util.fp.option;
|
||||
|
||||
import groowt.util.fp.hkt.Monoid;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public abstract sealed class Option<T> {
|
||||
|
||||
private static EmptyOption<Object> emptyInstance;
|
||||
|
||||
public static <T> Option<T> lift(T value) {
|
||||
return new ValueOption<>(Objects.requireNonNull(value));
|
||||
}
|
||||
|
||||
public static <T> Option<T> liftNullable(@Nullable T value) {
|
||||
return value == null ? empty() : lift(value);
|
||||
}
|
||||
|
||||
public static <T> Option<T> liftLazy(Supplier<? extends @NotNull T> valueSupplier) {
|
||||
return new SupplierOption<>(Objects.requireNonNull(valueSupplier));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> Option<T> empty() {
|
||||
if (emptyInstance == null) {
|
||||
emptyInstance = new EmptyOption<>();
|
||||
}
|
||||
return (Option<T>) emptyInstance;
|
||||
}
|
||||
|
||||
private static final class EmptyOption<T> extends Option<T> {
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
throw new NullPointerException("Cannot get() on EmptyOption");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPresent() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static final class ValueOption<T> extends Option<T> {
|
||||
|
||||
private final T value;
|
||||
|
||||
public ValueOption(T value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static final class SupplierOption<T> extends Option<T> {
|
||||
|
||||
private final Supplier<T> valueSupplier;
|
||||
|
||||
public SupplierOption(Supplier<? extends T> valueSupplier) {
|
||||
this.valueSupplier = valueSupplier::get;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
return Objects.requireNonNull(
|
||||
this.valueSupplier.get(),
|
||||
"Cannot get() when the given valueSupplier returns null."
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public abstract T get();
|
||||
|
||||
public boolean isPresent() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public @NotNull T getOrElse(T other) {
|
||||
return this.isPresent() ? this.get() : Objects.requireNonNull(other);
|
||||
}
|
||||
|
||||
public @Nullable T getOrElseNull() {
|
||||
return this.isPresent() ? this.get() : null;
|
||||
}
|
||||
|
||||
public Option<T> orElseLift(T other) {
|
||||
return this.isPresent() ? this : new ValueOption<>(Objects.requireNonNull(other));
|
||||
}
|
||||
|
||||
public Option<T> orElseLiftLazy(Supplier<? extends @NotNull T> lazyOther) {
|
||||
return this.isPresent() ? this : new SupplierOption<>(Objects.requireNonNull(lazyOther));
|
||||
}
|
||||
|
||||
public <U> Option<U> map(Function<? super T, ? extends @NotNull U> mapper) {
|
||||
return new SupplierOption<>(() -> mapper.apply(this.get()));
|
||||
}
|
||||
|
||||
public <U> Option<U> mapLazy(Function<? super T, ? extends Supplier<? extends @NotNull U>> lazyMapper) {
|
||||
return new SupplierOption<>(() -> lazyMapper.apply(this.get()).get());
|
||||
}
|
||||
|
||||
public <U> Option<U> flatMap(Function<? super T, Option<? extends U>> mapper) {
|
||||
return new SupplierOption<>(() -> mapper.apply(this.get()).get());
|
||||
}
|
||||
|
||||
public <U> Option<U> flatMapLazy(Function<? super T, Option<Supplier<? extends @NotNull U>>> lazyMapper) {
|
||||
return new SupplierOption<>(() -> lazyMapper.apply(this.get()).get().get());
|
||||
}
|
||||
|
||||
public void ifPresent(Consumer<T> onPresent) {
|
||||
if (this.isPresent()) {
|
||||
onPresent.accept(this.get());
|
||||
}
|
||||
}
|
||||
|
||||
public void ifPresentOrElse(Consumer<T> onPresent, Runnable orElse) {
|
||||
if (this.isPresent()) {
|
||||
onPresent.accept(this.get());
|
||||
} else {
|
||||
orElse.run();
|
||||
}
|
||||
}
|
||||
|
||||
public <R> R fold(Function<? super T, ? extends R> onPresent, Supplier<? extends R> onEmpty) {
|
||||
if (this.isPresent()) {
|
||||
return onPresent.apply(this.get());
|
||||
} else {
|
||||
return onEmpty.get();
|
||||
}
|
||||
}
|
||||
|
||||
public <R> R foldMap(Monoid<R> monoid, Function<? super T, ? extends R> onPresent) {
|
||||
if (this.isPresent()) {
|
||||
return onPresent.apply(this.get());
|
||||
} else {
|
||||
return monoid.empty();
|
||||
}
|
||||
}
|
||||
|
||||
public <R> R foldFlatMap(Monoid<R> monoid, Function<? super T, Option<? extends R>> onPresent) {
|
||||
if (this.isPresent()) {
|
||||
return onPresent.apply(this.get()).get();
|
||||
} else {
|
||||
return monoid.empty();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
package groowt.util.fp.property;
|
||||
|
||||
import groowt.util.fp.provider.DefaultListProvider;
|
||||
import groowt.util.fp.provider.DefaultProvider;
|
||||
import groowt.util.fp.provider.ListProvider;
|
||||
import groowt.util.fp.provider.Provider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class DefaultListProperty<T> implements ListProperty<T> {
|
||||
|
||||
public static <T> ListProperty<T> ofType(Class<T> type) {
|
||||
return new DefaultListProperty<>(type);
|
||||
}
|
||||
|
||||
private final Class<T> type;
|
||||
private final List<Provider<T>> elementProviders = new ArrayList<>();
|
||||
|
||||
protected DefaultListProperty(Class<T> type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<T> getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addElement(T element) {
|
||||
this.elementProviders.add(DefaultProvider.of(element));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void addProvider(Provider<? extends T> elementProvider) {
|
||||
this.elementProviders.add((Provider<T>) elementProvider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addAllElements(Collection<? extends T> elements) {
|
||||
elements.forEach(this::addElement);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addAllProviders(Collection<? extends Provider<? extends T>> elementProviders) {
|
||||
elementProviders.forEach(this::addProvider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U> ListProvider<U> map(Class<U> targetType, Function<? super T, ? extends U> mapper) {
|
||||
return DefaultListProvider.ofElementProviders(targetType, this.elementProviders.stream()
|
||||
.map(elementProvider -> elementProvider.map(targetType, mapper))
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U> ListProvider<U> flatMap(
|
||||
Class<U> targetType,
|
||||
Function<? super T, ? extends Provider<? extends U>> flatMapper
|
||||
) {
|
||||
return DefaultListProvider.ofElementProviders(targetType, this.elementProviders.stream()
|
||||
.map(elementProvider -> elementProvider.flatMap(targetType, flatMapper))
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U extends T> ListProvider<U> withType(Class<U> desiredType) {
|
||||
return DefaultListProvider.ofElementProviders(desiredType, this.elementProviders.stream()
|
||||
.filter(elementProvider -> desiredType.isAssignableFrom(elementProvider.getType()))
|
||||
.map(elementProvider -> elementProvider.map(desiredType, desiredType::cast))
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> get() {
|
||||
return this.elementProviders.stream()
|
||||
.map(Provider::get)
|
||||
.toList();
|
||||
}
|
||||
|
||||
}
|
@ -1,114 +0,0 @@
|
||||
package groowt.util.fp.property;
|
||||
|
||||
import groovy.lang.Closure;
|
||||
import groowt.util.fp.provider.DefaultProvider;
|
||||
import groowt.util.fp.provider.Provider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
public class DefaultProperty<T> implements Property<T> {
|
||||
|
||||
public static <T> Property<T> empty(Class<T> type) {
|
||||
return new DefaultProperty<>(type);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> Property<T> of(T t) {
|
||||
final Property<T> property = new DefaultProperty<>((Class<T>) t.getClass());
|
||||
property.set(t);
|
||||
return property;
|
||||
}
|
||||
|
||||
public static <T> Property<T> ofProvider(Class<T> type, Provider<T> tProvider) {
|
||||
final Property<T> property = new DefaultProperty<>(type);
|
||||
property.set(tProvider);
|
||||
return property;
|
||||
}
|
||||
|
||||
public static <T> Property<T> ofLazy(Class<T> type, Supplier<T> tSupplier) {
|
||||
final Property<T> property = new DefaultProperty<>(type);
|
||||
property.set(DefaultProvider.ofLazy(type, tSupplier));
|
||||
return property;
|
||||
}
|
||||
|
||||
private final Class<T> type;
|
||||
private final List<Closure<?>> configureClosures = new ArrayList<>();
|
||||
|
||||
private Provider<? extends T> provider;
|
||||
private Provider<? extends T> convention;
|
||||
|
||||
protected DefaultProperty(Class<T> type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<T> getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPresent() {
|
||||
return this.provider != null || this.convention != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return this.provider == null && this.convention == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(T t) {
|
||||
requireNonNull(t);
|
||||
this.provider = DefaultProvider.of(t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(Provider<? extends T> tProvider) {
|
||||
requireNonNull(tProvider);
|
||||
this.provider = tProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setConvention(T convention) {
|
||||
requireNonNull(convention);
|
||||
this.convention = DefaultProvider.of(convention);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setConvention(Provider<? extends T> convention) {
|
||||
requireNonNull(convention);
|
||||
this.convention = convention;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configure(Closure<?> configureClosure) {
|
||||
this.configureClosures.add(configureClosure);
|
||||
}
|
||||
|
||||
private void doConfigures(T t) {
|
||||
for (final var configureClosure : this.configureClosures) {
|
||||
configureClosure.setDelegate(t);
|
||||
configureClosure.call(t);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
if (!this.isPresent()) {
|
||||
throw new NullPointerException("Cannot get() from an empty Property. Set the value or set the convention.");
|
||||
}
|
||||
final T t;
|
||||
if (this.provider != null) {
|
||||
t = this.provider.get();
|
||||
} else {
|
||||
t = this.convention.get();
|
||||
}
|
||||
this.doConfigures(t);
|
||||
return t;
|
||||
}
|
||||
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
package groowt.util.fp.property;
|
||||
|
||||
import groowt.util.fp.provider.ListProvider;
|
||||
import groowt.util.fp.provider.Provider;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
|
||||
public interface ListProperty<T> extends ListProvider<T> {
|
||||
|
||||
void addElement(T element);
|
||||
void addProvider(Provider<? extends T> elementProvider);
|
||||
void addAllElements(Collection<? extends T> elements);
|
||||
void addAllProviders(Collection<? extends Provider<? extends T>> elementProviders);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default void leftShift(Object object) {
|
||||
Objects.requireNonNull(object);
|
||||
if (object instanceof Provider<?> provider) {
|
||||
if (!this.getType().isAssignableFrom(provider.getType())) {
|
||||
throw new IllegalArgumentException(
|
||||
"The type of the given Provider (" + provider.getType().getName() + ") is not compatible with" +
|
||||
"the type of this ListProperty (" + this.getType().getName() + ")."
|
||||
);
|
||||
}
|
||||
this.addProvider((Provider<? extends T>) provider);
|
||||
} else if (this.getType().isAssignableFrom(object.getClass())) {
|
||||
this.addElement((T) object);
|
||||
} else {
|
||||
throw new IllegalArgumentException("The type of the given object (" + object.getClass().getName() +
|
||||
") is not compatible with the type of this ListProperty (" + this.getType().getName() + ")."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package groowt.util.fp.property;
|
||||
|
||||
import groovy.lang.Closure;
|
||||
import groovy.lang.DelegatesTo;
|
||||
import groovy.transform.stc.ClosureParams;
|
||||
import groovy.transform.stc.FromString;
|
||||
import groowt.util.fp.provider.Provider;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public interface Property<T> extends Provider<T> {
|
||||
|
||||
void set(T t);
|
||||
void set(Provider<? extends T> tProvider);
|
||||
void setConvention(T t);
|
||||
void setConvention(Provider<? extends T> tProvider);
|
||||
|
||||
void configure(
|
||||
@DelegatesTo(type = "T")
|
||||
@ClosureParams(value = FromString.class, options = "T")
|
||||
Closure<?> configureClosure
|
||||
);
|
||||
|
||||
boolean isPresent();
|
||||
boolean isEmpty();
|
||||
|
||||
default T fold(@Nullable T onEmpty) {
|
||||
if (this.isPresent()) {
|
||||
return this.get();
|
||||
} else {
|
||||
return onEmpty;
|
||||
}
|
||||
}
|
||||
|
||||
default T fold(Provider<? extends T> onEmpty) {
|
||||
if (this.isPresent()) {
|
||||
return this.get();
|
||||
} else {
|
||||
return onEmpty.get();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,74 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class DefaultListProvider<T> implements ListProvider<T> {
|
||||
|
||||
public static <T> ListProvider<T> ofElements(Class<T> elementType, List<? extends T> elements) {
|
||||
return new DefaultListProvider<>(
|
||||
elementType,
|
||||
elements.stream()
|
||||
.<Provider<T>>map(DefaultProvider::of)
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
public static <T> ListProvider<T> ofElementProviders(
|
||||
Class<T> elementType,
|
||||
List<? extends Provider<T>> elementProviders
|
||||
) {
|
||||
return new DefaultListProvider<>(elementType, elementProviders);
|
||||
}
|
||||
|
||||
private final Class<T> elementType;
|
||||
private final List<Provider<T>> elementProviders;
|
||||
|
||||
private DefaultListProvider(Class<T> elementType, List<? extends Provider<T>> elementProviders) {
|
||||
this.elementType = elementType;
|
||||
this.elementProviders = new ArrayList<>(elementProviders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<T> getType() {
|
||||
return this.elementType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U> ListProvider<U> map(Class<U> targetType, Function<? super T, ? extends U> mapper) {
|
||||
final List<Provider<U>> uProviders = this.elementProviders.stream()
|
||||
.map(elementProvider -> elementProvider.map(targetType, mapper))
|
||||
.toList();
|
||||
return new DefaultListProvider<>(targetType, uProviders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U> ListProvider<U> flatMap(
|
||||
Class<U> targetType,
|
||||
Function<? super T, ? extends Provider<? extends U>> flatMapper
|
||||
) {
|
||||
final List<Provider<U>> uProviders = this.elementProviders.stream()
|
||||
.map(elementProvider -> elementProvider.flatMap(targetType, flatMapper))
|
||||
.toList();
|
||||
return new DefaultListProvider<>(targetType, uProviders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U extends T> ListProvider<U> withType(Class<U> desiredType) {
|
||||
return new DefaultListProvider<>(desiredType, this.elementProviders.stream()
|
||||
.filter(elementProvider -> desiredType.isAssignableFrom(elementProvider.getType()))
|
||||
.map(elementProvider -> elementProvider.map(desiredType, desiredType::cast))
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> get() {
|
||||
final List<? extends T> filtered = this.elementProviders.stream()
|
||||
.map(Provider::get)
|
||||
.toList();
|
||||
return new ArrayList<>(filtered);
|
||||
}
|
||||
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
class DefaultNamedProvider<T> implements NamedProvider<T> {
|
||||
|
||||
private final Class<T> type;
|
||||
private final String name;
|
||||
private final Provider<T> delegate;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public DefaultNamedProvider(String name, T element) {
|
||||
this.type = (Class<T>) element.getClass();
|
||||
this.name = name;
|
||||
this.delegate = DefaultProvider.of(element);
|
||||
}
|
||||
|
||||
public DefaultNamedProvider(Class<T> type, String name, Provider<T> delegate) {
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<T> getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
return this.delegate.get();
|
||||
}
|
||||
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
class DefaultNamedSetProvider<T> extends DefaultSetProvider<T> implements NamedSetProvider<T> {
|
||||
|
||||
public static <T> NamedSetProvider<T> ofElementsAndNames(Class<T> type, Map<String, T> namesAndElements) {
|
||||
return new DefaultNamedSetProvider<>(type, namesAndElements.entrySet().stream()
|
||||
.map(entry -> new DefaultNamedProvider<>(entry.getKey(), entry.getValue()))
|
||||
.collect(Collectors.toSet())
|
||||
);
|
||||
}
|
||||
|
||||
public static <T> NamedSetProvider<T> ofNamedProviders(Class<T> type, Set<? extends NamedProvider<T>> providers) {
|
||||
return new DefaultNamedSetProvider<>(type, providers);
|
||||
}
|
||||
|
||||
protected DefaultNamedSetProvider(Class<T> type, Set<? extends NamedProvider<T>> elementProviders) {
|
||||
super(type, elementProviders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NamedSetProvider<T> withNames(Predicate<? super String> namePredicate) {
|
||||
return new DefaultNamedSetProvider<>(this.getType(), this.getProviders().stream()
|
||||
.map(provider -> (NamedProvider<T>) provider)
|
||||
.filter(namedProvider -> namePredicate.test(namedProvider.getName()))
|
||||
.collect(Collectors.toSet())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NamedProvider<T> withName(String name) {
|
||||
return this.getProviders().stream()
|
||||
.map(provider -> (NamedProvider<T>) provider)
|
||||
.filter(namedProvider -> name.equals(namedProvider.getName()))
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new NullPointerException("There is no NamedProvider present with name " + name));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public NamedSetProvider<T> zipWithNames(NamedSetProvider<? extends T> other) {
|
||||
final Set<NamedProvider<T>> combined = new HashSet<>();
|
||||
this.getProviders().forEach(provider -> combined.add((NamedProvider<T>) provider));
|
||||
other.getProviders().forEach(provider -> combined.add((NamedProvider<T>) provider));
|
||||
return new DefaultNamedSetProvider<>(this.getType(), combined);
|
||||
}
|
||||
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class DefaultProvider<T> implements Provider<T> {
|
||||
|
||||
public static <T> Provider<T> of(T t) {
|
||||
Objects.requireNonNull(t);
|
||||
return new DefaultProvider<>(t);
|
||||
}
|
||||
|
||||
public static <T> Provider<T> ofLazy(Class<T> type, Supplier<? extends T> tSupplier) {
|
||||
Objects.requireNonNull(type);
|
||||
Objects.requireNonNull(tSupplier);
|
||||
return new DefaultProvider<>(type, tSupplier);
|
||||
}
|
||||
|
||||
private final Class<T> type;
|
||||
private final Supplier<T> tSupplier;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected DefaultProvider(T t) {
|
||||
this.tSupplier = () -> t;
|
||||
this.type = (Class<T>) t.getClass();
|
||||
}
|
||||
|
||||
protected DefaultProvider(Class<T> type, Supplier<? extends T> tSupplier) {
|
||||
this.type = type;
|
||||
this.tSupplier = tSupplier::get;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<T> getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
return Objects.requireNonNull(this.tSupplier.get());
|
||||
}
|
||||
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class DefaultSetProvider<T> implements SetProvider<T> {
|
||||
|
||||
public static <T> SetProvider<T> ofElements(Class<T> type, Set<? extends T> elements) {
|
||||
return new DefaultSetProvider<>(type, elements.stream()
|
||||
.<Provider<T>>map(DefaultProvider::of)
|
||||
.collect(Collectors.toSet())
|
||||
);
|
||||
}
|
||||
|
||||
public static <T> SetProvider<T> ofElementProviders(Class<T> type, Set<? extends Provider<T>> providers) {
|
||||
return new DefaultSetProvider<>(type, providers);
|
||||
}
|
||||
|
||||
private final Class<T> type;
|
||||
private final Set<Provider<T>> elementProviders;
|
||||
|
||||
protected DefaultSetProvider(Class<T> type, Set<? extends Provider<T>> elementProviders) {
|
||||
this.type = type;
|
||||
this.elementProviders = new HashSet<>(elementProviders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<T> getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Provider<T>> getProviders() {
|
||||
return this.elementProviders;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U> SetProvider<U> map(Class<U> targetType, Function<? super T, ? extends U> mapper) {
|
||||
return new DefaultSetProvider<>(targetType, this.elementProviders.stream()
|
||||
.map(elementProvider -> elementProvider.map(targetType, mapper))
|
||||
.collect(Collectors.toSet())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U> SetProvider<U> flatMap(Class<U> targetType, Function<? super T, ? extends Provider<U>> mapper) {
|
||||
return new DefaultSetProvider<>(targetType, this.elementProviders.stream()
|
||||
.map(elementProvider -> elementProvider.flatMap(targetType, mapper))
|
||||
.collect(Collectors.toSet())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <U> SetProvider<U> withType(Class<U> desiredType) {
|
||||
return new DefaultSetProvider<>(desiredType, this.elementProviders.stream()
|
||||
.filter(elementProvider -> desiredType.isAssignableFrom(elementProvider.getType()))
|
||||
.map(elementProvider -> elementProvider.map(desiredType, desiredType::cast))
|
||||
.collect(Collectors.toSet())
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public SetProvider<T> zip(SetProvider<? extends T> other) {
|
||||
final Set<Provider<T>> combined = new HashSet<>();
|
||||
combined.addAll(this.elementProviders);
|
||||
other.getProviders().forEach(provider -> combined.add((Provider<T>) provider));
|
||||
return new DefaultSetProvider<>(this.getType(), combined);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<T> get() {
|
||||
return this.elementProviders.stream().map(Provider::get).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
public interface ListProvider<T> {
|
||||
|
||||
Class<T> getType();
|
||||
|
||||
<U> ListProvider<U> map(Class<U> targetType, Function<? super T, ? extends U> mapper);
|
||||
<U> ListProvider<U> flatMap(Class<U> targetType, Function<? super T, ? extends Provider<? extends U>> flatMapper);
|
||||
|
||||
<U extends T> ListProvider<U> withType(Class<U> desiredType);
|
||||
|
||||
List<T> get();
|
||||
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import groowt.util.fp.hkt.SemiGroup;
|
||||
|
||||
public interface NamedProvider<T> extends Provider<T> {
|
||||
|
||||
String getName();
|
||||
|
||||
default NamedProvider<T> zipWithNames(
|
||||
SemiGroup<T> tSemiGroup,
|
||||
SemiGroup<String> nameSemiGroup,
|
||||
NamedProvider<? extends T> other
|
||||
) {
|
||||
return new DefaultNamedProvider<>(
|
||||
this.getType(),
|
||||
nameSemiGroup.concat(this.getName(), other.getName()),
|
||||
DefaultProvider.ofLazy(this.getType(), () -> tSemiGroup.concat(this.get(), other.get()))
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public interface NamedSetProvider<T> extends SetProvider<T> {
|
||||
|
||||
NamedSetProvider<T> withNames(Predicate<? super String> namePredicate);
|
||||
NamedProvider<T> withName(String name);
|
||||
|
||||
NamedSetProvider<T> zipWithNames(NamedSetProvider<? extends T> other);
|
||||
|
||||
}
|
@ -1,72 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import groowt.util.fp.hkt.SemiGroup;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* @implSpec Must throw {@link NullPointerException} if the contained value is {@code null}
|
||||
* when either created or when retrieved.
|
||||
*
|
||||
* @param <T> The type of the value contained within.
|
||||
*/
|
||||
public interface Provider<T> {
|
||||
|
||||
Class<T> getType();
|
||||
|
||||
/**
|
||||
* @implSpec Must throw {@link NullPointerException} if the value is null.
|
||||
*
|
||||
* @throws NullPointerException if the value contained within this Provider is null.
|
||||
* @return The value.
|
||||
*/
|
||||
T get();
|
||||
|
||||
default T get(Supplier<RuntimeException> onEmpty) {
|
||||
try {
|
||||
return this.get();
|
||||
} catch (NullPointerException nullPointerException) {
|
||||
final RuntimeException onEmptyException = onEmpty.get();
|
||||
onEmptyException.initCause(nullPointerException);
|
||||
throw onEmptyException;
|
||||
}
|
||||
}
|
||||
|
||||
default Provider<T> filter(Predicate<? super T> filter) {
|
||||
Objects.requireNonNull(filter);
|
||||
return new DefaultProvider<>(this.getType(), () -> {
|
||||
final T t = this.get();
|
||||
if (filter.test(t)) {
|
||||
return t;
|
||||
} else {
|
||||
throw new NullPointerException("This Provider is empty (did not pass filter).");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
default <U> Provider<U> map(Class<U> targetType, Function<? super T, ? extends U> mapper) {
|
||||
Objects.requireNonNull(mapper);
|
||||
return new DefaultProvider<>(targetType, () -> mapper.apply(this.get()));
|
||||
}
|
||||
|
||||
default <U> Provider<U> flatMap(
|
||||
Class<U> targetType,
|
||||
Function<? super T, ? extends Provider<? extends U>> flatMapper
|
||||
) {
|
||||
Objects.requireNonNull(flatMapper);
|
||||
return new DefaultProvider<>(targetType, () -> flatMapper.apply(this.get()).get());
|
||||
}
|
||||
|
||||
default Provider<T> zip(
|
||||
SemiGroup<T> semiGroup,
|
||||
Provider<? extends T> other
|
||||
) {
|
||||
Objects.requireNonNull(semiGroup);
|
||||
Objects.requireNonNull(other);
|
||||
return new DefaultProvider<>(this.getType(), () -> semiGroup.concat(this.get(), other.get()));
|
||||
}
|
||||
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package groowt.util.fp.provider;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
|
||||
public interface SetProvider<T> {
|
||||
|
||||
Class<T> getType();
|
||||
|
||||
Set<Provider<T>> getProviders();
|
||||
|
||||
<U> SetProvider<U> map(Class<U> targetType, Function<? super T, ? extends U> mapper);
|
||||
|
||||
<U> SetProvider<U> flatMap(Class<U> targetType, Function<? super T, ? extends Provider<U>> mapper);
|
||||
|
||||
<U> SetProvider<U> withType(Class<U> desiredType);
|
||||
|
||||
Set<T> get();
|
||||
|
||||
SetProvider<T> zip(SetProvider<? extends T> other);
|
||||
|
||||
}
|
@ -55,7 +55,6 @@ sourceSets {
|
||||
dependencies {
|
||||
api project(':web-view-components')
|
||||
api libs.antlr.runtime
|
||||
api project(':fp')
|
||||
|
||||
compileOnlyApi libs.jetbrains.anotations
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user