/** * Triplicates a Stream * Buffers intermediate values, leaders may change positions so a limit * can be safely applied to the leading stream. Not thread-safe. * <pre> * {@code * Triple<SequenceM<Triple<T1,T2,T3>>,SequenceM<Triple<T1,T2,T3>>,SequenceM<Triple<T1,T2,T3>>> triple = sequence.triplicate(); * } * </pre> */ @SuppressWarnings("unchecked") public final Triple<SequenceM<T>,SequenceM<T>,SequenceM<T>> triplicate(){ Stream<SequenceM<T>> its = StreamUtils.toBufferingCopier(monad.iterator(),3) .stream() .map(it -> StreamUtils.stream(it)) .map(stream -> new SequenceM<>(stream)); return new Triple(its.collect(Collectors.toList())); } /**
/** * zip 4 Streams into 1 * * <pre> * {@code * List<Quadruple<Integer,Integer,Character,String>> list = of(1,2,3,4,5,6).zip4(of(100,200,300,400),of('a','b','c'),of("hello","world")) .collect(Collectors.toList()); * } * //[[1,100,'a',"hello"],[2,200,'b',"world"]] * </pre> */ public final <T2,T3,T4> SequenceM<Quadruple<T,T2,T3,T4>> zip4(Stream<T2> second,Stream<T3> third,Stream<T4> fourth){ return zip3(second,third).zip(fourth).map(t -> new Quadruple(t._1()._1(), t._1()._2(),t._1()._3(),t._2())); } /**
/** * Unzip a zipped Stream into 3 * <pre> * {@code * unzip3(SequenceM.of(new Triple(1, "a", 2l), new Triple(2, "b", 3l), new Triple(3,"c", 4l))) * } * // SequenceM[1,2,3], SequenceM[a,b,c], SequenceM[2l,3l,4l] * </pre> */ public final static <T1,T2,T3> Triple<SequenceM<T1>,SequenceM<T2>,SequenceM<T3>> unzip3(SequenceM<Triple<T1,T2,T3>> sequence){ Triple<SequenceM<Triple<T1,T2,T3>>,SequenceM<Triple<T1,T2,T3>>,SequenceM<Triple<T1,T2,T3>>> triple = sequence.triplicate(); return new Triple(triple.v1.map(Triple::_1),triple.v2.map(Triple::_2),triple.v3.map(Triple::_3)); } /**
/** * zip 3 Streams into one * <pre> * {@code * List<Triple<Integer,Integer,Character>> list = of(1,2,3,4,5,6).zip3(of(100,200,300,400),of('a','b','c')) .collect(Collectors.toList()); * * //[[1,100,'a'],[2,200,'b'],[3,300,'c']] * } * *</pre> */ public final <S,U> SequenceM<Triple<T,S,U>> zip3(Stream<? extends S> second,Stream<? extends U> third){ return zip(second).zip(third).map(p -> new Triple(p._1()._1(),p._1()._2(),p._2())); } /**