/** * Peek at the current value of this Transformable, without transforming it * * <pre> * {@code * * * of(1,2,3).map(System.out::println) * * 1 * 2 * 3 * * } * </pre> * @param c Consumer that recieves each element from this Transformable * @return Transformable that will peek at each value */ default Transformable<T> peek(final Consumer<? super T> c) { return map(input -> { c.accept(input); return input; }); }
public static <T> Unrestricted<T> liftF(final Transformable<T> functor){ return new Suspend<T>(functor.map(Unrestricted::done)); }
private <U> LazyEither3<Transformable<Unrestricted<T>>, T, Unrestricted<T>> resumeNestedFree(){ Function<IN, Unrestricted<T>> f = narrowFn(); return free.fold(pure-> LazyEither3.right(f.apply(pure.value)), s-> LazyEither3.left1(s.suspended.map(o -> o.flatMap(f))), fm->{ final FlatMapped<U, IN> flatMapped2 = (FlatMapped<U, IN>)fm; return LazyEither3.right(flatMapped2.free.flatMap(o -> flatMapped2.fn.apply(o).flatMap(fn))); }); }
public <B,R> Unrestricted<R> zip(Unrestricted<B> b,BiFunction<? super T,? super B,? extends R> zipper){ Either<Transformable<Unrestricted<T>>, T> first = resume(); Either<Transformable<Unrestricted<B>>, B> second = b.resume(); if(first.isLeft() && second.isLeft()) { return suspend(first.leftOrElse(null).map(a1->{ return suspend(second.leftOrElse(null).map(b1->a1.zip(b1,zipper))); })); } if(first.isRight() && second.isRight()){ return done(zipper.apply(first.orElse(null),second.orElse(null))); } if(first.isLeft() && second.isRight()){ return suspend(first.leftOrElse(null).map(a1->a1.zip(b,zipper))); } if(first.isRight() && second.isLeft()){ return suspend(second.leftOrElse(null).map(a1->this.zip(b,zipper))); } return null; } public <B,C> Unrestricted<Tuple3<T,B,C>> zip(Unrestricted<B> b, Unrestricted<C> c){
return suspend(first.leftOrElse(null).map(a1->{ return suspend(second.leftOrElse(null).map(b1->{ return suspend(third.leftOrElse(null).map(c1->a1.zip(b1,c1,fn))); })); })); return suspend(first.leftOrElse(null).map(a1->a1.zip(b,c,fn))); return suspend(second.leftOrElse(null).map(b1->this.zip(b1,c,fn))); return suspend(third.leftOrElse(null).map(c1->this.zip(b,c1,fn))); return suspend(second.leftOrElse(null).map(b1->{ return suspend(third.leftOrElse(null).map(c1->this.zip(b1,c1,fn))); })); return suspend(first.leftOrElse(null).map(a1->{ return suspend(third.leftOrElse(null).map(c1->a1.zip(b,c1,fn))); return suspend(first.leftOrElse(null).map(a1->{ return suspend(second.leftOrElse(null).map(b1->a1.zip(b1,c,fn)));
/** * Peek at the current value of this Transformable, without transforming it * * <pre> * {@code * * * of(1,2,3).map(System.out::println) * * 1 * 2 * 3 * * } * </pre> * @param c Consumer that recieves each element from this Transformable * @return Transformable that will peek at each value */ default Transformable<T> peek(final Consumer<? super T> c) { return map(input -> { c.accept(input); return input; }); }
public static <T> Unrestricted<T> liftF(final Transformable<T> functor){ return new Suspend<T>(functor.map(Unrestricted::done)); }
private <U> LazyEither3<Transformable<Unrestricted<T>>, T, Unrestricted<T>> resumeNestedFree(){ Function<IN, Unrestricted<T>> f = narrowFn(); return free.fold(pure-> LazyEither3.right(f.apply(pure.value)), s-> LazyEither3.left1(s.suspended.map(o -> o.flatMap(f))), fm->{ final FlatMapped<U, IN> flatMapped2 = (FlatMapped<U, IN>)fm; return LazyEither3.right(flatMapped2.free.flatMap(o -> flatMapped2.fn.apply(o).flatMap(fn))); }); }
public <B,R> Unrestricted<R> zip(Unrestricted<B> b,BiFunction<? super T,? super B,? extends R> zipper){ Either<Transformable<Unrestricted<T>>, T> first = resume(); Either<Transformable<Unrestricted<B>>, B> second = b.resume(); if(first.isLeft() && second.isLeft()) { return suspend(first.leftOrElse(null).map(a1->{ return suspend(second.leftOrElse(null).map(b1->a1.zip(b1,zipper))); })); } if(first.isRight() && second.isRight()){ return done(zipper.apply(first.orElse(null),second.orElse(null))); } if(first.isLeft() && second.isRight()){ return suspend(first.leftOrElse(null).map(a1->a1.zip(b,zipper))); } if(first.isRight() && second.isLeft()){ return suspend(second.leftOrElse(null).map(a1->this.zip(b,zipper))); } return null; } public <B,C> Unrestricted<Tuple3<T,B,C>> zip(Unrestricted<B> b, Unrestricted<C> c){
return suspend(first.leftOrElse(null).map(a1->{ return suspend(second.leftOrElse(null).map(b1->{ return suspend(third.leftOrElse(null).map(c1->a1.zip(b1,c1,fn))); })); })); return suspend(first.leftOrElse(null).map(a1->a1.zip(b,c,fn))); return suspend(second.leftOrElse(null).map(b1->this.zip(b1,c,fn))); return suspend(third.leftOrElse(null).map(c1->this.zip(b,c1,fn))); return suspend(second.leftOrElse(null).map(b1->{ return suspend(third.leftOrElse(null).map(c1->this.zip(b1,c1,fn))); })); return suspend(first.leftOrElse(null).map(a1->{ return suspend(third.leftOrElse(null).map(c1->a1.zip(b,c1,fn))); return suspend(first.leftOrElse(null).map(a1->{ return suspend(second.leftOrElse(null).map(b1->a1.zip(b1,c,fn)));