package bjc.utils.ioutils.blocks; import java.io.IOException; import java.util.function.BooleanSupplier; import java.util.function.Supplier; /** * A block reader composed from functions. * * @author EVE * */ public class BoundBlockReader implements BlockReader { /** * A function that serves to close an I/O source. * * @author EVE * */ @FunctionalInterface public interface Closer { /** * Close the I/O source this is attached to. * * @throws IOException * If something goes wrong */ public void close() throws IOException; } private BooleanSupplier checker; private Supplier getter; private Closer closer; private Block current; private int blockNo; /** * Create a new bound block reader. * * @param blockChecker * Predicate for checking if a block is available * @param blockGetter * Function to retrieve a block * @param blockCloser * Function to close a block source */ public BoundBlockReader(BooleanSupplier blockChecker, Supplier blockGetter, Closer blockCloser) { checker = blockChecker; getter = blockGetter; closer = blockCloser; blockNo = 0; } @Override public boolean hasNextBlock() { return checker.getAsBoolean(); } @Override public Block getBlock() { return current; } @Override public boolean nextBlock() { if (checker.getAsBoolean()) { current = getter.get(); blockNo += 1; return true; } return false; } @Override public int getBlockCount() { return blockNo; } @Override public void close() throws IOException { closer.close(); } }