/** * 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())); } /**
/** * 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())); } /**