@SuppressWarnings("unchecked") @Override default <T1, T2, T3> Tuple3<Tree<T1>, Tree<T2>, Tree<T3>> unzip3( Function<? super T, Tuple3<? extends T1, ? extends T2, ? extends T3>> unzipper) { Objects.requireNonNull(unzipper, "unzipper is null"); if (isEmpty()) { return Tuple.of(Empty.instance(), Empty.instance(), Empty.instance()); } else { return (Tuple3<Tree<T1>, Tree<T2>, Tree<T3>>) (Object) Unzip.apply3((Node<T>) this, unzipper); } }
static <T, T1, T2, T3> Tuple3<Node<T1>, Node<T2>, Node<T3>> apply3( Node<T> node, Function<? super T, Tuple3<? extends T1, ? extends T2, ? extends T3>> unzipper) { final Tuple3<? extends T1, ? extends T2, ? extends T3> value = unzipper.apply(node.getValue()); final List<Tuple3<Node<T1>, Node<T2>, Node<T3>>> children = node.getChildren().map(child -> Unzip.apply3(child, unzipper)); final Node<T1> node1 = new Node<>(value._1, children.map(t -> t._1)); final Node<T2> node2 = new Node<>(value._2, children.map(t -> t._2)); final Node<T3> node3 = new Node<>(value._3, children.map(t -> t._3)); return Tuple.of(node1, node2, node3); }