summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/ioutils/blocks/BlockReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/src/main/java/bjc/utils/ioutils/blocks/BlockReader.java')
-rw-r--r--base/src/main/java/bjc/utils/ioutils/blocks/BlockReader.java73
1 files changed, 73 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/ioutils/blocks/BlockReader.java b/base/src/main/java/bjc/utils/ioutils/blocks/BlockReader.java
new file mode 100644
index 0000000..3c695c6
--- /dev/null
+++ b/base/src/main/java/bjc/utils/ioutils/blocks/BlockReader.java
@@ -0,0 +1,73 @@
+package bjc.utils.ioutils.blocks;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.function.Consumer;
+
+/**
+ * A source of blocks of characters, marked with line numbers as to block
+ * start/block end.
+ *
+ * @author bjculkin
+ *
+ */
+public interface BlockReader extends AutoCloseable, Iterator<Block> {
+ /**
+ * Check if this reader has an available block.
+ *
+ * @return Whether or not another block is available.
+ */
+ boolean hasNextBlock();
+
+ /**
+ * Get the current block.
+ *
+ * @return The current block, or null if there is no current block.
+ */
+ Block getBlock();
+
+ /**
+ * Move to the next block.
+ *
+ * @return Whether or not the next block was successfully read.
+ */
+ boolean nextBlock();
+
+ /**
+ * Retrieve the number of blocks that have been read so far.
+ *
+ * @return The number of blocks read so far.
+ */
+ int getBlockCount();
+
+ @Override
+ void close() throws IOException;
+
+ /*
+ * Methods with default impls.
+ */
+
+ /**
+ * Execute an action for each remaining block.
+ *
+ * @param action
+ * The action to execute for each block
+ */
+ default void forEachBlock(final Consumer<Block> action) {
+ while (hasNext()) {
+ action.accept(next());
+ }
+ }
+
+ @Override
+ default boolean hasNext() {
+ return hasNextBlock();
+ }
+
+ @Override
+ default Block next() {
+ nextBlock();
+
+ return getBlock();
+ }
+}