From c7116f9bd0471f8638b888472426e383f64cbcdc Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sun, 18 Aug 2024 23:29:37 +0800 Subject: Some more modularisation --- .../main/java/lv/enes/orang/utils/Codepoint.java | 8 +++++ .../java/lv/enes/orang/utils/PeekableStream.java | 38 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 utils/src/main/java/lv/enes/orang/utils/Codepoint.java create mode 100644 utils/src/main/java/lv/enes/orang/utils/PeekableStream.java (limited to 'utils') diff --git a/utils/src/main/java/lv/enes/orang/utils/Codepoint.java b/utils/src/main/java/lv/enes/orang/utils/Codepoint.java new file mode 100644 index 0000000..a981c5e --- /dev/null +++ b/utils/src/main/java/lv/enes/orang/utils/Codepoint.java @@ -0,0 +1,8 @@ +package lv.enes.orang.utils; + +public record Codepoint(int cp) { + @Override + public String toString() { + return Character.toString(cp); + } +} diff --git a/utils/src/main/java/lv/enes/orang/utils/PeekableStream.java b/utils/src/main/java/lv/enes/orang/utils/PeekableStream.java new file mode 100644 index 0000000..7607a50 --- /dev/null +++ b/utils/src/main/java/lv/enes/orang/utils/PeekableStream.java @@ -0,0 +1,38 @@ +package lv.enes.orang.utils; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Iterator; + +public class PeekableStream implements Iterator { + private final Iterator input; + private final Deque buffer = new ArrayDeque<>(); + + public PeekableStream(Iterator input) { + this.input = input; + } + + @Override + public boolean hasNext() { + return !buffer.isEmpty() || input.hasNext(); + } + + @Override + public T next() { + if (!buffer.isEmpty()) { + return buffer.pop(); + } else { + return input.next(); + } + } + + public T peek() { + var value = next(); + putBack(value); + return value; + } + + public void putBack(T value) { + buffer.push(value); + } +} -- cgit v1.2.3