@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> leftPadTo(int length, T element) { final int actualLength = length(); if (length <= actualLength) { return this; } else { return Stream.continually(element).take(length - actualLength).appendAll(this); } }
@Override default Stream<T> dropRight(int n) { if (n <= 0) { return this; } else { return DropRight.apply(take(n).toList(), List.empty(), drop(n)); } }
@Override default Stream<T> padTo(int length, T element) { if (length <= 0) { return this; } else if (isEmpty()) { return Stream.continually(element).take(length); } else { return cons(head(), () -> tail().padTo(length - 1, element)); } }
/** * Generates arbitrary streams based on a given element generator arbitraryT. * <p> * Example: * <pre> * <code> * Arbitrary.stream(Arbitrary.integer()); * </code> * </pre> * * @param arbitraryT Arbitrary elements of type T * @param <T> Component type of the Stream * @return a new Arbitrary of Stream<T> */ static <T> Arbitrary<Stream<T>> stream(Arbitrary<T> arbitraryT) { return size -> { final Gen<T> genT = arbitraryT.apply(size); return random -> Stream.continually(() -> genT.apply(random)) .take(Gen.choose(0, size).apply(random)); }; } }
@Override default Stream<T> take(int n) { if (n < 1 || isEmpty()) { return empty(); } else if (n == 1) { return cons(head(), Stream::empty); } else { return cons(head(), () -> tail().take(n - 1)); } }
Stream<Integer> getHammingCodewordIndices(int msgLength) { return Stream.from(0, 1) .take(codewordSize(msgLength)); }
@Override default Tuple2<Stream<T>, Stream<T>> splitAt(int n) { return Tuple.of(take(n), drop(n)); }
@Override default Stream<T> leftPadTo(int length, T element) { final int actualLength = length(); if (length <= actualLength) { return this; } else { return Stream.continually(element).take(length - actualLength).appendAll(this); } }
@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)); } }
BinaryString stripHammingMetadata(EncodedString input) { String raw = Stream.from(0, 1).take(input.getValue().length()) .map(i -> Tuple.of(i + 1, Character.toString(input.getValue().charAt(i)))) .filter(t -> !HammingHelper.isPowerOfTwo(t._1)) .map(i -> i._2) .foldLeft("", String::concat); return BinaryString.of(raw); } }
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); } }
@Override default Stream<T> padTo(int length, T element) { if (length <= 0) { return this; } else if (isEmpty()) { return Stream.continually(element).take(length); } else { return cons(head(), () -> tail().padTo(length - 1, element)); } }
@Override default Stream<T> take(int n) { if (n < 1 || isEmpty()) { return empty(); } else if (n == 1) { return cons(head(), Stream::empty); } else { return cons(head(), () -> tail().take(n - 1)); } }