@Override
        public <N> Iterable<N> traverse(Graph<N> graph, N startNode) {
            Objects.requireNonNull(graph, "graph");
            Objects.requireNonNull(startNode, "startNode");
            return () -> new DepthFirstIterator<>(graph, startNode, DepthFirstIterator.Order.POST_ORDER);
        }
Traverses in depth-first post-order.

<p>"Post-order" implies that nodes appear in the order in which they are
visited for the last time.</p>

<p>See <a href="https://en.wikipedia.org/wiki/Depth-first_search">Wikipedia</a> for more info.</p>
common/src/main/java/me/lucko/luckperms/common/graph/TraversalAlgorithm.java