package net.hamnaberg.json.util; import java.math.BigDecimal; import java.util.List; import javaslang.control.Option; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import net.hamnaberg.json.Property; import net.hamnaberg.json.Value; public final class PropertyFunctions { private PropertyFunctions() { } private static <A, B> Function<A, Option<B>> optF() { return (ignore) -> Option.none();} private static final Function<Value, Option<String>> valueStringF = input -> input.fold(optF(), s -> Option.of(s.value), optF(), Option::none); private static final Function<Value, Option<BigDecimal>> valueNumberF = input -> input.fold(optF(), optF(), n -> Option.of(n.value), Option::none); private static final Function<Value, Option<Boolean>> valueBooleanF = input -> input.fold(n -> Option.of(n == Value.BooleanValue.TRUE), optF(), optF(), Option::none); public static final Function<Property, Option<String>> propertyToValueStringF = input -> input.getValue().flatMap(valueStringF); public static final Function<Property, Option<BigDecimal>> propertyToValueNumberF = input -> input.getValue().flatMap(valueNumberF); public static final Function<Property, Option<Boolean>> propertyToValueBooleanF = input -> input.getValue().flatMap(valueBooleanF); public static final Function<Property, List<String>> propertyToArrayStringF = input -> input.getArray() .stream() .map(valueStringF) .flatMap(javaslang.Value::toJavaStream) .collect(Collectors.toList()); public static final Function<Property, List<Number>> propertyToArrayNumberF = input -> input.getArray() .stream() .map(valueNumberF) .flatMap(javaslang.Value::toJavaStream) .collect(Collectors.toList()); public static final Function<Property, List<Boolean>> propertyToArrayBooleanF = input -> input.getArray() .stream() .map(valueBooleanF) .flatMap(javaslang.Value::toJavaStream) .collect(Collectors.toList()); }