/** * Makes four copies of 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 * * Quadruple<SequenceM<Quadruple<T1,T2,T3,T4>>,SequenceM<Quadruple<T1,T2,T3,T4>>,SequenceM<Quadruple<T1,T2,T3,T4>>,SequenceM<Quadruple<T1,T2,T3,T4>>> quad = sequence.quadruplicate(); * } * </pre> * @return */ @SuppressWarnings("unchecked") public final Quadruple<SequenceM<T>,SequenceM<T>,SequenceM<T>,SequenceM<T>> quadruplicate(){ Stream<SequenceM<T>> its = StreamUtils.toBufferingCopier(monad.iterator(),4) .stream() .map(it -> StreamUtils.stream(it)) .map(stream -> new SequenceM<>(stream)); return new Quadruple(its.collect(Collectors.toList())); } /**
/** * Unzip a zipped Stream into 4 * * <pre> * {@code * unzip4(SequenceM.of(new Quadruple(1, "a", 2l,'z'), new Quadruple(2, "b", 3l,'y'), new Quadruple(3, "c", 4l,'x'))); } // SequenceM[1,2,3], SequenceM[a,b,c], SequenceM[2l,3l,4l], SequenceM[z,y,x] * </pre> */ public final static <T1,T2,T3,T4> Quadruple<SequenceM<T1>,SequenceM<T2>,SequenceM<T3>,SequenceM<T4>> unzip4(SequenceM<Quadruple<T1,T2,T3,T4>> sequence){ Quadruple<SequenceM<Quadruple<T1,T2,T3,T4>>,SequenceM<Quadruple<T1,T2,T3,T4>>,SequenceM<Quadruple<T1,T2,T3,T4>>,SequenceM<Quadruple<T1,T2,T3,T4>>> quad = sequence.quadruplicate(); return new Quadruple(quad.v1.map(Quadruple::_1),quad.v2.map(Quadruple::_2),quad.v3.map(Quadruple::_3),quad.v4.map(Quadruple::_4)); }
/** * 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())); } /**