/** * 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; }); }
@Override default LazyEither3<LT1, LT2, RT> peek(final Consumer<? super RT> c) { return (LazyEither3<LT1, LT2, RT>) Transformable.super.peek(c); }
@Override default LazyEither5<LT1, LT2, LT3,LT4, RT> peek(final Consumer<? super RT> c) { return (LazyEither5<LT1, LT2, LT3, LT4, RT>) Transformable.super.peek(c); }
public static <T> Unrestricted<T> liftF(final Transformable<T> functor){ return new Suspend<T>(functor.map(Unrestricted::done)); }
@Override default ImmutableMap<K,V> peek(Consumer<? super V> c) { return (ImmutableMap<K,V>)Transformable.super.peek(c); }
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))); }); }
@Override public Tuple1<T> peek(Consumer<? super T> c) { return (Tuple1<T>)Transformable.super.peek(c); }
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){
@Override default LazyEither4<LT1, LT2, LT3, RT> peek(final Consumer<? super RT> c) { return (LazyEither4<LT1, LT2, LT3, RT>) Transformable.super.peek(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)));
@Override public LazyImmutable<T> peek(final Consumer<? super T> c) { return (LazyImmutable<T>) Transformable.super.peek(c); }
/** * 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; }); }
@Override default ImmutableMap<K,V> peek(Consumer<? super V> c) { return (ImmutableMap<K,V>)Transformable.super.peek(c); }
public static <T> Unrestricted<T> liftF(final Transformable<T> functor){ return new Suspend<T>(functor.map(Unrestricted::done)); }
@Override public Tuple1<T> peek(Consumer<? super T> c) { return (Tuple1<T>)Transformable.super.peek(c); }
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))); }); }
@Override default LazyEither4<LT1, LT2, LT3, RT> peek(final Consumer<? super RT> c) { return (LazyEither4<LT1, LT2, LT3, RT>) Transformable.super.peek(c); }
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){
@Override default LazyEither3<LT1, LT2, RT> peek(final Consumer<? super RT> c) { return (LazyEither3<LT1, LT2, RT>) Transformable.super.peek(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)));