@Nullable @RecursiveMethod private static PathParts splitFromRight( @NotNull Path left, @NotNull String right, @NotNull Predicate<Path> leftPredicate) { if (leftPredicate.apply(left)) return new PathParts(left, right); // Reached left end of a relative path if (!left.getPath().contains("/") && !left.getPath().contains("\\")) return null; String[] leftParts = splitAtLastSeparator(left.getPath()); // Reached Unix root if (leftParts[0].isEmpty()) return null; // Reached Windows root if (leftParts[0].matches("[a-zA-Z]:")) return null; // Move by one path part to the left and recurse String newRight = Util.joinPath(leftParts[1], right); return splitFromRight(new Path(leftParts[0]), newRight, leftPredicate); }
@NotNull public Path createSubPath(@NotNull String pathPart) { return new Path(Util.joinPath(path, pathPart)); }