@Override default Tuple2<Stream<T>, Stream<T>> splitAt(int n) { return Tuple.of(take(n), drop(n)); }
@Override default Stream<T> patch(int from, Iterable<? extends T> that, int replaced) { from = from < 0 ? 0 : from; replaced = replaced < 0 ? 0 : replaced; Stream<T> result = take(from).appendAll(that); from += replaced; result = result.appendAll(drop(from)); return result; }
@Override default Stream<T> takeRight(int n) { Stream<T> right = this; Stream<T> remaining = drop(n); while (!remaining.isEmpty()) { right = right.tail(); remaining = remaining.tail(); } return right; }
@Override default Stream<T> dropRight(int n) { if (n <= 0) { return this; } else { return DropRight.apply(take(n).toList(), List.empty(), drop(n)); } }
static <T> Stream<Stream<T>> apply(Stream<T> elements, int k) { if (k == 0) { return Stream.of(Stream.empty()); } else { return elements.zipWithIndex().flatMap( t -> apply(elements.drop(t._2 + 1), (k - 1)).map((Stream<T> c) -> c.prepend(t._1)) ); } } }
@Override default Tuple2<Stream<T>, Stream<T>> splitAt(int n) { return Tuple.of(take(n), drop(n)); }
@Override default Stream<T> takeRight(int n) { Stream<T> right = this; Stream<T> remaining = drop(n); while (!remaining.isEmpty()) { right = right.tail(); remaining = remaining.tail(); } return right; }
@Override default Stream<T> patch(int from, Iterable<? extends T> that, int replaced) { from = from < 0 ? 0 : from; replaced = replaced < 0 ? 0 : replaced; Stream<T> result = take(from).appendAll(that); from += replaced; result = result.appendAll(drop(from)); return result; }
@Override default Stream<T> dropRight(int n) { if (n <= 0) { return this; } else { return DropRight.apply(take(n).toList(), List.empty(), drop(n)); } }
Stream<Integer> parityIndicesSequence(int startIndex, int endExclusive) { return Stream.from(startIndex, 1) .take(endExclusive - startIndex) .zipWithIndex() .filter(t -> (t._2 % ((2 * (startIndex + 1)))) < startIndex + 1) .map(t -> t._1) .drop(1); } }
static <T> Stream<Stream<T>> apply(Stream<T> elements, int k) { if (k == 0) { return Stream.of(Stream.empty()); } else { return elements.zipWithIndex().flatMap( t -> apply(elements.drop(t._2 + 1), (k - 1)).map((Stream<T> c) -> c.prepend(t._1)) ); } } }