static <T> Stream<Node<T>> traverseLevelOrder(Node<T> node) { Stream<Node<T>> result = Stream.empty(); final java.util.Queue<Node<T>> queue = new java.util.LinkedList<>(); queue.add(node); while (!queue.isEmpty()) { final Node<T> next = queue.remove(); result = result.prepend(next); queue.addAll(next.getChildren().toJavaList()); } return result.reverse(); }
static <T> Stream<Node<T>> traverseInOrder(Node<T> node) { if (node.isLeaf()) { return Stream.of(node); } else { final io.vavr.collection.List<Node<T>> children = node.getChildren(); return children .tail() .foldLeft(Stream.<Node<T>> empty(), (acc, child) -> acc.appendAll(traverseInOrder(child))) .prepend(node) .prependAll(traverseInOrder(children.head())); } }
@Override default Stream<T> update(int index, T element) { if (isEmpty()) { throw new IndexOutOfBoundsException("update(" + index + ", e) on Nil"); } if (index < 0) { throw new IndexOutOfBoundsException("update(" + index + ", e)"); } Stream<T> preceding = Empty.instance(); Stream<T> tail = this; for (int i = index; i > 0; i--, tail = tail.tail()) { if (tail.isEmpty()) { throw new IndexOutOfBoundsException("update at " + index); } preceding = preceding.prepend(tail.head()); } if (tail.isEmpty()) { throw new IndexOutOfBoundsException("update at " + index); } // skip the current head element because it is replaced return preceding.reverse().appendAll(tail.tail().prepend(element)); }
static <T> Stream<Node<T>> traverseInOrder(Node<T> node) { if (node.isLeaf()) { return Stream.of(node); } else { final io.vavr.collection.List<Node<T>> children = node.getChildren(); return children .tail() .foldLeft(Stream.<Node<T>> empty(), (acc, child) -> acc.appendAll(traverseInOrder(child))) .prepend(node) .prependAll(traverseInOrder(children.head())); } }
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 Stream<Stream<T>> permutations() { if (isEmpty()) { return Empty.instance(); } else { final Stream<T> tail = tail(); if (tail.isEmpty()) { return Stream.of(this); } else { final Stream<Stream<T>> zero = Empty.instance(); return distinct().foldLeft(zero, (xs, x) -> { final Function<Stream<T>, Stream<T>> prepend = l -> l.prepend(x); return xs.appendAll(remove(x).permutations().map(prepend)); }); } } }
static <T> Stream<Node<T>> traverseLevelOrder(Node<T> node) { Stream<Node<T>> result = Stream.empty(); final java.util.Queue<Node<T>> queue = new java.util.LinkedList<>(); queue.add(node); while (!queue.isEmpty()) { final Node<T> next = queue.remove(); result = result.prepend(next); queue.addAll(next.getChildren().toJavaList()); } return result.reverse(); }
@Override default Stream<T> update(int index, T element) { if (isEmpty()) { throw new IndexOutOfBoundsException("update(" + index + ", e) on Nil"); } if (index < 0) { throw new IndexOutOfBoundsException("update(" + index + ", e)"); } Stream<T> preceding = Empty.instance(); Stream<T> tail = this; for (int i = index; i > 0; i--, tail = tail.tail()) { if (tail.isEmpty()) { throw new IndexOutOfBoundsException("update at " + index); } preceding = preceding.prepend(tail.head()); } if (tail.isEmpty()) { throw new IndexOutOfBoundsException("update at " + index); } // skip the current head element because it is replaced return preceding.reverse().appendAll(tail.tail().prepend(element)); }
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 Stream<Stream<T>> permutations() { if (isEmpty()) { return Empty.instance(); } else { final Stream<T> tail = tail(); if (tail.isEmpty()) { return Stream.of(this); } else { final Stream<Stream<T>> zero = Empty.instance(); return distinct().foldLeft(zero, (xs, x) -> { final Function<Stream<T>, Stream<T>> prepend = l -> l.prepend(x); return xs.appendAll(remove(x).permutations().map(prepend)); }); } } }