UpdateResult<Node> (State state, Entry<Node> parent) { VirtualFile[] children = state.getChildren(parent.getNode().getFile()); if (children == null) return tree.update(parent, null); if (children.length == 0) return tree.update(parent, Collections.emptyList()); return tree.update(parent, Arrays.stream(children).filter(state::isVisible).sorted(state::compare).map(file -> { Entry<Node> entry = tree.findEntry(file); return entry != null && parent == entry.getParentPath() ? Pair.create(entry.getNode(), entry.isLeaf()) : Pair.create(new Node(state, file), state.isLeaf(file)); }).collect(Collectors.toList())); }