public static @Nullable <T> DataNode<T> findChild(
    @NotNull DataNode<?> node,
    @NotNull Key<T> key,
    @Nullable Predicate<? super DataNode<T>> predicate
  ) {
    for (DataNode<?> child : node.getChildren()) {
      if (key.equals(child.getKey())) {
        //noinspection unchecked
        var childNode = (DataNode<T>)child;
        if (predicate == null || predicate.test(childNode)) {
          return childNode;
        }
      }
    }
    return null;
  }
public static @Nullable <T> DataNode<T> findChild(
    @NotNull DataNode<?> node,
    @NotNull Key<T> key,
    @Nullable Predicate<? super DataNode<T>> predicate
  )