From 53c06909bec4b7c3bfb399b5823b356bd5e6b19b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Apr 2016 15:21:39 +0100 Subject: Allow richer description of file list --- .../java/org/zwobble/couscous/util/FileSet.java | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/java/org/zwobble/couscous/util/FileSet.java (limited to 'src/main/java/org/zwobble/couscous/util/FileSet.java') diff --git a/src/main/java/org/zwobble/couscous/util/FileSet.java b/src/main/java/org/zwobble/couscous/util/FileSet.java new file mode 100644 index 0000000..c64c1e8 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/util/FileSet.java @@ -0,0 +1,70 @@ +package org.zwobble.couscous.util; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.zwobble.couscous.util.ExtraIterables.iterable; +import static org.zwobble.couscous.util.ExtraLists.*; + +public class FileSet { + public static FileSet globs(List files) { + return new FileSet(() -> { + Set paths = new HashSet<>(); + + for (String file : files) { + if (file.startsWith("!")) { + walkFiles(path(file.substring(1))).forEach(paths::remove); + } else { + walkFiles(path(file)).forEach(paths::add); + } + } + + return paths.stream() + .sorted() + .iterator(); + }, list()); + } + + private static Iterable walkFiles(Path root) { + return iterable(() -> { + try { + return Files.walk(root) + .filter(path -> path.toFile().isFile()); + } catch (IOException exception) { + throw new RuntimeException(exception); + } + }); + } + + private static Path path(String output) { + return FileSystems.getDefault().getPath(output); + } + + public static FileSet directory(Path path) { + return new FileSet(walkFiles(path), list()); + } + + private final Iterable files; + private final List> filters; + + private FileSet(Iterable files, List> filters) { + this.files = files; + this.filters = filters; + } + + public FileSet filter(Predicate predicate) { + return new FileSet(files, cons(predicate, filters)); + } + + public List files() { + return eagerFilter(files, file -> Iterables.all(filters, filter -> filter.apply(file))); + } +} -- cgit v1.2.3