/** * A flattening transformation operation that takes the first value from the returned Iterable. * * <pre> * {@code * Maybe.just(1).map(i->i+2).concatMap(i->Arrays.asList(()->i*3,20); * //Maybe[9] * * }</pre> * * * @param mapper transformation function * @return MonadicValue */ default <R> MonadicValue<R> concatMap(final Function<? super T, ? extends Iterable<? extends R>> mapper) { return this.flatMap(a -> { return Maybe.fromIterable(mapper.apply(a)); }); }
/** * Perform a two level nested internal iteration over this MonadicValue and the * supplied MonadicValue * * <pre> * {@code * Maybe.of(3) * .forEach2(a->Maybe.none(), * (a,b)->a+b); * * * //Maybe.none() * } * </pre> * * * @param value1 * Nested Monadic Type to iterate over * @param yieldingFunction * Function with pointers to the current element from both * monad types that generates the new elements * @return MonadicValue with elements generated via nested iteration */ default <R1, R> MonadicValue<R> forEach2(Function<? super T, ? extends MonadicValue<R1>> value1, final BiFunction<? super T, ? super R1, ? extends R> yieldingFunction){ return this.flatMap(in-> { MonadicValue<R1> b = value1.apply(in); return b.map(in2->yieldingFunction.apply(in, in2)); }); }
final BiFunction<? super T, ? super R1, ? extends MonadicValue<R2>> value2, final Function3<? super T, ? super R1, ? super R2, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.map(in2->yieldingFunction.apply(in,ina, in2));
final Function3<? super T, ? super R1, ? super R2, ? extends MonadicValue<R3>> value3, final Function4<? super T, ? super R1, ? super R2, ? super R3, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.flatMap(inb-> { MonadicValue<R3> c= value3.apply(in,ina,inb); return c.map(in2->yieldingFunction.apply(in,ina,inb,in2));
final BiFunction<? super T, ? super R1, Boolean> filterFunction, final BiFunction<? super T, ? super R1, ? extends R> yieldingFunction){ return this.flatMap(in-> {
final Function3<? super T, ? super R1, ? super R2, Boolean> filterFunction, final Function3<? super T, ? super R1, ? super R2, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.filter(in2-> filterFunction.apply(in,ina,in2)).map(in2->yieldingFunction.apply(in,ina, in2));
final Function4<? super T, ? super R1, ? super R2, ? super R3, Boolean> filterFunction, final Function4<? super T, ? super R1, ? super R2, ? super R3, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.flatMap(inb-> { MonadicValue<R3> c= value3.apply(in,ina,inb); return c.filter(in2-> filterFunction.apply(in,ina,inb,in2)).map(in2->yieldingFunction.apply(in,ina,inb,in2));
/** * A flattening transformation operation that takes the first value from the returned Publisher. * <pre> * {@code * Future.ofResult(1).map(i->i+2).mergeMap(i->Flux.just(()->i*3,20); * //Future[9] * * }</pre> * * @param mapper transformation function * @return MonadicValue */ default <R> MonadicValue<R> mergeMap(final Function<? super T, ? extends Publisher<? extends R>> mapper) { return this.flatMap(a -> { final Publisher<? extends R> publisher = mapper.apply(a); final ValueSubscriber<R> sub = ValueSubscriber.subscriber(); publisher.subscribe(sub); final Maybe<R> maybe = sub.toMaybe(); return maybe.fold(in->unit(in),__->emptyUnit()); }); }
/** * A flattening transformation operation that takes the first value from the returned Iterable. * * <pre> * {@code * Maybe.just(1).map(i->i+2).concatMap(i->Arrays.asList(()->i*3,20); * //Maybe[9] * * }</pre> * * * @param mapper transformation function * @return MonadicValue */ default <R> MonadicValue<R> concatMap(final Function<? super T, ? extends Iterable<? extends R>> mapper) { return this.flatMap(a -> { return Maybe.fromIterable(mapper.apply(a)); }); }
/** * Perform a two level nested internal iteration over this MonadicValue and the * supplied MonadicValue * * <pre> * {@code * Maybe.of(3) * .forEach2(a->Maybe.none(), * (a,b)->a+b); * * * //Maybe.none() * } * </pre> * * * @param value1 * Nested Monadic Type to iterate over * @param yieldingFunction * Function with pointers to the current element from both * monad types that generates the new elements * @return MonadicValue with elements generated via nested iteration */ default <R1, R> MonadicValue<R> forEach2(Function<? super T, ? extends MonadicValue<R1>> value1, final BiFunction<? super T, ? super R1, ? extends R> yieldingFunction){ return this.flatMap(in-> { MonadicValue<R1> b = value1.apply(in); return b.map(in2->yieldingFunction.apply(in, in2)); }); }
final BiFunction<? super T, ? super R1, ? extends MonadicValue<R2>> value2, final Function3<? super T, ? super R1, ? super R2, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.map(in2->yieldingFunction.apply(in,ina, in2));
final Function3<? super T, ? super R1, ? super R2, ? extends MonadicValue<R3>> value3, final Function4<? super T, ? super R1, ? super R2, ? super R3, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.flatMap(inb-> { MonadicValue<R3> c= value3.apply(in,ina,inb); return c.map(in2->yieldingFunction.apply(in,ina,inb,in2));
final BiFunction<? super T, ? super R1, Boolean> filterFunction, final BiFunction<? super T, ? super R1, ? extends R> yieldingFunction){ return this.flatMap(in-> {
final Function4<? super T, ? super R1, ? super R2, ? super R3, Boolean> filterFunction, final Function4<? super T, ? super R1, ? super R2, ? super R3, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.flatMap(inb-> { MonadicValue<R3> c= value3.apply(in,ina,inb); return c.filter(in2-> filterFunction.apply(in,ina,inb,in2)).map(in2->yieldingFunction.apply(in,ina,inb,in2));
final Function3<? super T, ? super R1, ? super R2, Boolean> filterFunction, final Function3<? super T, ? super R1, ? super R2, ? extends R> yieldingFunction){ return this.flatMap(in-> { return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.filter(in2-> filterFunction.apply(in,ina,in2)).map(in2->yieldingFunction.apply(in,ina, in2));
/** * A flattening transformation operation that takes the first value from the returned Publisher. * <pre> * {@code * Future.ofResult(1).map(i->i+2).mergeMap(i->Flux.just(()->i*3,20); * //Future[9] * * }</pre> * * @param mapper transformation function * @return MonadicValue */ default <R> MonadicValue<R> mergeMap(final Function<? super T, ? extends Publisher<? extends R>> mapper) { return this.flatMap(a -> { final Publisher<? extends R> publisher = mapper.apply(a); final ValueSubscriber<R> sub = ValueSubscriber.subscriber(); publisher.subscribe(sub); final Maybe<R> maybe = sub.toMaybe(); return maybe.fold(in->unit(in),__->emptyUnit()); }); }