diff --git a/datagen/src/main/java/it/cavallium/datagen/NativeNullable.java b/datagen/src/main/java/it/cavallium/datagen/NativeNullable.java index 88ae94c..e3ac94d 100644 --- a/datagen/src/main/java/it/cavallium/datagen/NativeNullable.java +++ b/datagen/src/main/java/it/cavallium/datagen/NativeNullable.java @@ -1,5 +1,11 @@ package it.cavallium.datagen; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,4 +27,75 @@ public interface NativeNullable { @Nullable T getNullable(@Nullable T defaultValue); + + default @NotNull TN map( + @NotNull Function<@NotNull T, @NotNull U> value, + @NotNull Function<@Nullable U, @NotNull TN> nullableConstructor) { + var nullable = getNullable(); + if (nullable != null) { + var val = value.apply(nullable); + Objects.requireNonNull(val, "Mapped value must not be null"); + return nullableConstructor.apply(val); + } else { + return nullableConstructor.apply(null); + } + } + + default > @NotNull TN mapNullable( + @NotNull Function<@NotNull T, @NotNull TN> value, + @NotNull Supplier<@NotNull TN> emptyNullableConstructor) { + var nullable = getNullable(); + if (nullable != null) { + var val = value.apply(nullable); + Objects.requireNonNull(val, "Mapped value must not be null"); + return val; + } else { + return emptyNullableConstructor.get(); + } + } + + default @NotNull Optional map(@NotNull Function<@NotNull T, @NotNull U> value) { + var nullable = getNullable(); + if (nullable != null) { + var val = value.apply(nullable); + return Optional.of(val); + } else { + return Optional.empty(); + } + } + + @SuppressWarnings("unchecked") + default > @NotNull TN filter( + @NotNull Predicate<@NotNull T> value, + @NotNull Supplier nullableConstructor) { + var nullable = getNullable(); + if (nullable != null) { + var filter = value.test(nullable); + if (!filter) { + return nullableConstructor.get(); + } + } + return (TN) this; + } + + default @NotNull Optional filter(@NotNull Predicate<@NotNull T> value) { + var nullable = getNullable(); + if (nullable != null) { + var filter = value.test(nullable); + if (!filter) { + return Optional.empty(); + } + } + return Optional.ofNullable(nullable); + } + + default @NotNull Optional toOptional() { + var nullable = getNullable(); + return Optional.ofNullable(nullable); + } + + default @NotNull Stream stream() { + var nullable = getNullable(); + return Stream.ofNullable(nullable); + } } diff --git a/datagen/src/main/java/it/cavallium/datagen/TypedNullable.java b/datagen/src/main/java/it/cavallium/datagen/TypedNullable.java index c8e9928..ee4a5d4 100644 --- a/datagen/src/main/java/it/cavallium/datagen/TypedNullable.java +++ b/datagen/src/main/java/it/cavallium/datagen/TypedNullable.java @@ -1,11 +1,6 @@ package it.cavallium.datagen; import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,62 +52,4 @@ public interface TypedNullable extends NativeNullable { default boolean isEmpty() { return getNullable() == null; } - - default > @NotNull TN map( - @NotNull Function<@NotNull T, @NotNull U> value, - @NotNull Function<@Nullable U, @NotNull TN> nullableConstructor) { - var nullable = getNullable(); - if (nullable != null) { - var val = value.apply(nullable); - Objects.requireNonNull(val, "Mapped value must not be null"); - return nullableConstructor.apply(val); - } else { - return nullableConstructor.apply(null); - } - } - - default @NotNull Optional map(@NotNull Function<@NotNull T, @NotNull U> value) { - var nullable = getNullable(); - if (nullable != null) { - var val = value.apply(nullable); - return Optional.of(val); - } else { - return Optional.empty(); - } - } - - @SuppressWarnings("unchecked") - default > @NotNull TN filter( - @NotNull Predicate<@NotNull T> value, - @NotNull Supplier nullableConstructor) { - var nullable = getNullable(); - if (nullable != null) { - var filter = value.test(nullable); - if (!filter) { - return nullableConstructor.get(); - } - } - return (TN) this; - } - - default @NotNull Optional filter(@NotNull Predicate<@NotNull T> value) { - var nullable = getNullable(); - if (nullable != null) { - var filter = value.test(nullable); - if (!filter) { - return Optional.empty(); - } - } - return Optional.ofNullable(nullable); - } - - default @NotNull Optional toOptional() { - var nullable = getNullable(); - return Optional.ofNullable(nullable); - } - - default @NotNull Stream stream() { - var nullable = getNullable(); - return Stream.ofNullable(nullable); - } }