From 05bb1067b348f43108fd04b968dc53fc338373fb Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Tue, 16 Aug 2022 23:04:07 -0400 Subject: Update a few things --- .../java/bjc/utils/funcutils/IteratorUtils.java | 2 +- .../bjc/utils/ioutils/blocks/BlockReaders.java | 12 ++ .../utils/ioutils/blocks/IteratorBlockReader.java | 52 ++++++++ .../bjc/utils/parserutils/pattern/PatternPart.java | 147 +++++++++++++++++++++ base/src/main/java/module-info.java | 2 - 5 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 base/src/main/java/bjc/utils/ioutils/blocks/IteratorBlockReader.java create mode 100644 base/src/main/java/bjc/utils/parserutils/pattern/PatternPart.java (limited to 'base/src/main/java') diff --git a/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java b/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java index 662b1bf..5f6368e 100644 --- a/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java +++ b/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java @@ -111,5 +111,5 @@ public class IteratorUtils { { Queue backer = new ArrayDeque<>(); return Pair.pair(backer::add, new QueueBackedIterator<>(backer)); - } + } } diff --git a/base/src/main/java/bjc/utils/ioutils/blocks/BlockReaders.java b/base/src/main/java/bjc/utils/ioutils/blocks/BlockReaders.java index 16d50c0..2342c22 100644 --- a/base/src/main/java/bjc/utils/ioutils/blocks/BlockReaders.java +++ b/base/src/main/java/bjc/utils/ioutils/blocks/BlockReaders.java @@ -1,6 +1,7 @@ package bjc.utils.ioutils.blocks; import java.io.*; +import java.util.Iterator; /** Utility methods for constructing instances of {@link BlockReader} * @@ -59,4 +60,15 @@ public class BlockReaders { public static BlockReader serial(final BlockReader... readers) { return new SerialBlockReader(readers); } + + /** + * Create a block reader from an iterator of blocks. + * + * @param iter The iterator of blocks. + * + * @return A block reader which returns blocks from the given iterator. + */ + public static BlockReader fromIterator(final Iterator iter) { + return new IteratorBlockReader(iter); + } } diff --git a/base/src/main/java/bjc/utils/ioutils/blocks/IteratorBlockReader.java b/base/src/main/java/bjc/utils/ioutils/blocks/IteratorBlockReader.java new file mode 100644 index 0000000..de4a083 --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/blocks/IteratorBlockReader.java @@ -0,0 +1,52 @@ +package bjc.utils.ioutils.blocks; + +import java.io.IOException; +import java.util.Iterator; + +/** + * BlockReader which produces blocks from an iterator + * + * @author bjcul + */ +public final class IteratorBlockReader implements BlockReader { + private final Iterator iter; + private Block currBlock; + private int blockCount = 0; + + /** + * Create a new block reader from an iterator. + * + * @param iter The iterator to get blocks from. + */ + public IteratorBlockReader(Iterator iter) { + this.iter = iter; + } + + @Override + public boolean nextBlock() { + if (!iter.hasNext()) return false; + currBlock = iter.next(); + blockCount++; + return true; + } + + @Override + public boolean hasNextBlock() { + return iter.hasNext(); + } + + @Override + public int getBlockCount() { + return blockCount; + } + + @Override + public Block getBlock() { + return currBlock; + } + + @Override + public void close() throws IOException { + // Nothing for us to really do + } +} \ No newline at end of file diff --git a/base/src/main/java/bjc/utils/parserutils/pattern/PatternPart.java b/base/src/main/java/bjc/utils/parserutils/pattern/PatternPart.java new file mode 100644 index 0000000..6661072 --- /dev/null +++ b/base/src/main/java/bjc/utils/parserutils/pattern/PatternPart.java @@ -0,0 +1,147 @@ +package bjc.utils.parserutils.pattern; + +import java.util.StringJoiner; +import java.util.function.Supplier; +import java.util.regex.*; + +/** + * Builder interface for regex patterns. + * + * @author bjculkin + * + */ +public interface PatternPart { + /** + * Convert this pattern part into a regex. + * + * @return The regex this part represents. + */ + public String toRegex(); + + public boolean canOptimize(); + + static PatternPart part(boolean canOptimize, Supplier func) { + return new PatternPart() { + + @Override + public String toRegex() { + return func.get(); + } + + @Override + public boolean canOptimize() { + return canOptimize; + } + }; + } + + static PatternPart var(Supplier source) { + return part(false, source); + } + /** + * Create a 'raw' pattern part, which just echoes the given string. + * + * @param str The regex to include + * + * @return A pattern part which converts to the given string. + */ + static PatternPart raw(String str) { + return part(true, () -> str); + } + + static PatternPart joining(String joiner, PatternPart... parts) { + return new PatternPart() { + + @Override + public String toRegex() { + StringJoiner sj = new StringJoiner(joiner); + for (PatternPart part : parts) sj.add(part.toRegex()); + return sj.toString(); + } + + @Override + public boolean canOptimize() { + for (PatternPart part : parts) + if (!part.canOptimize()) return false; + + return true; + } + }; + } + /** + * Create a pattern part which matches the given string. + * + * @param str The string to match + * + * @return A pattern which matches the given string. + */ + static PatternPart literal(String str) { + return part(true, () -> Pattern.quote(str)); + } + + /** + * Create a pattern part which matches a single digit. + * + * @return A pattern that matches a digit. + */ + static PatternPart digit() { + return raw("\\d"); + } + + static PatternPart cclass(char... chars) { + return part(true, () -> { + StringBuilder sb = new StringBuilder("["); + for (char ch : chars) sb.append(ch); + sb.append("]"); + return sb.toString(); + }); + } + + static PatternPart notCClass(char... chars) { + return part(true, () -> { + StringBuilder sb = new StringBuilder("[^"); + for (char ch : chars) sb.append(ch); + sb.append("]"); + return sb.toString(); + }); + } + + static PatternPart nonspace() { + return raw("\\S"); + } + + static PatternPart concat(PatternPart... parts) { + return joining(" ", parts); + } + + static PatternPart alternate(PatternPart... parts) { + return joining("|", parts); + } + + static PatternPart repeat(PatternPart part) { + return part(part.canOptimize(), () -> part.toRegex() + "*"); + } + + static PatternPart optional(PatternPart part) { + return part(part.canOptimize(), () -> part.toRegex() + "?"); + } + + static PatternPart repeatAtLeastOnce(PatternPart part) { + return part(part.canOptimize(), () -> part.toRegex() + "*"); + } + + static PatternPart surround(String lhs, String rhs, PatternPart part) { + return part(part.canOptimize(), () -> lhs + part.toRegex() + rhs); + } + static PatternPart group(PatternPart part) { + return surround("(", ")", part); + } + + static PatternPart namedGroup(String groupName, PatternPart part) { + return surround("(<" + groupName + ">", ")", part); + } + + static PatternPart nonCaptureGroup(PatternPart part) { + return surround("(?:", ")", part); + } +} diff --git a/base/src/main/java/module-info.java b/base/src/main/java/module-info.java index 188046b..3901514 100644 --- a/base/src/main/java/module-info.java +++ b/base/src/main/java/module-info.java @@ -3,7 +3,6 @@ module bjc.utils { exports bjc.utils.funcutils; exports bjc.utils.parserutils.splitter; exports bjc.utils.ioutils; - exports bjc.utils.examples; exports bjc.utils.misc; exports bjc.utils.parserutils.delims; exports bjc.utils.gen; @@ -12,7 +11,6 @@ module bjc.utils { exports bjc.utils.cli; exports bjc.utils.gui.awt; exports bjc.utils.gui.layout; - exports bjc.utils.examples.gen; exports bjc.utils.math; exports bjc.utils.gui; exports bjc.utils.parserutils; -- cgit v1.2.3