diff --git a/src/main/java/it/cavallium/data/generator/TypedNullable.java b/src/main/java/it/cavallium/data/generator/TypedNullable.java index 56d5dcd..86d6417 100644 --- a/src/main/java/it/cavallium/data/generator/TypedNullable.java +++ b/src/main/java/it/cavallium/data/generator/TypedNullable.java @@ -1,6 +1,11 @@ package it.cavallium.data.generator; 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; @@ -52,4 +57,62 @@ 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); + } }