/** * 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)); }); }
return b.filter(in2-> filterFunction.apply(in,in2)).map(in2->yieldingFunction.apply(in, in2)); });
default <R> Try<R,Throwable> mapTry(Function<? super T,? extends R> fn){ Try<? extends MonadicValue<? extends R>, Throwable> x = Try.withCatch(() -> map(fn)); return x.flatMap(a->a.toTry()); }
default <X extends Throwable,R> Try<R,X> mapTry(Function<? super T,? extends R> fn, Class<X>... exceptionTypes){ Try<? extends MonadicValue<? extends R>, X> x = Try.withCatch(() -> map(fn),exceptionTypes); return x.flatMap(a->a.toTry(exceptionTypes)); }
return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.map(in2->yieldingFunction.apply(in,ina, in2)); });
default <R> Future<R> mapAsync(Function<? super T,? extends R> fn, Executor ex){ return Future.of(()->map(fn),ex).flatMap(a->a.fold(s->Future.ofResult(s),()->Future.ofError(new NoSuchElementException()))); }
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)); });
return b.flatMap(inb-> { MonadicValue<R3> c= value3.apply(in,ina,inb); return c.map(in2->yieldingFunction.apply(in,ina,inb,in2)); });
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)); });
/** * 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)); }); }
return b.filter(in2-> filterFunction.apply(in,in2)).map(in2->yieldingFunction.apply(in, in2)); });
default <R> Try<R,Throwable> mapTry(Function<? super T,? extends R> fn){ Try<? extends MonadicValue<? extends R>, Throwable> x = Try.withCatch(() -> map(fn)); return x.flatMap(a->a.toTry()); }
default <X extends Throwable,R> Try<R,X> mapTry(Function<? super T,? extends R> fn, Class<X>... exceptionTypes){ Try<? extends MonadicValue<? extends R>, X> x = Try.withCatch(() -> map(fn),exceptionTypes); return x.flatMap(a->a.toTry(exceptionTypes)); }
return a.flatMap(ina-> { MonadicValue<R2> b = value2.apply(in,ina); return b.map(in2->yieldingFunction.apply(in,ina, in2)); });
default <R> Future<R> mapAsync(Function<? super T,? extends R> fn, Executor ex){ return Future.of(()->map(fn),ex).flatMap(a->a.fold(s->Future.ofResult(s),()->Future.ofError(new NoSuchElementException()))); }
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)); });
return b.flatMap(inb-> { MonadicValue<R3> c= value3.apply(in,ina,inb); return c.map(in2->yieldingFunction.apply(in,ina,inb,in2)); });
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)); });