summaryrefslogtreecommitdiff
path: root/examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala')
-rw-r--r--examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala69
1 files changed, 69 insertions, 0 deletions
diff --git a/examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala b/examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala
new file mode 100644
index 0000000..2ca8f90
--- /dev/null
+++ b/examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala
@@ -0,0 +1,69 @@
+package java.io
+
+class StringReader(s: String) extends Reader {
+
+ private[this] var closed = false
+ private[this] var pos = 0
+ private[this] var mark = 0
+
+ override def close(): Unit = {
+ closed = true
+ }
+
+ override def mark(readAheadLimit: Int): Unit = {
+ ensureOpen()
+
+ mark = pos
+ }
+
+ override def markSupported(): Boolean = true
+
+ override def read(): Int = {
+ ensureOpen()
+
+ if (pos < s.length) {
+ val res = s.charAt(pos).toInt
+ pos += 1
+ res
+ } else -1
+ }
+
+ override def read(cbuf: Array[Char], off: Int, len: Int): Int = {
+ ensureOpen()
+
+ if (off < 0 || len < 0 || len > cbuf.length - off)
+ throw new IndexOutOfBoundsException
+
+ if (len == 0) 0
+ else {
+ val count = Math.min(len, s.length - pos)
+ var i = 0
+ while (i < count) {
+ cbuf(off + i) = s.charAt(pos + i)
+ i += 1
+ }
+ pos += count
+ count
+ }
+ }
+
+ override def ready(): Boolean = pos < s.length
+
+ override def reset(): Unit = {
+ ensureOpen()
+ pos = mark
+ }
+
+ override def skip(ns: Long): Long = {
+ // Apparently, StringReader.skip allows negative skips
+ val count = Math.max(Math.min(ns, s.length - pos).toInt, -pos)
+ pos += count
+ count.toLong
+ }
+
+ private def ensureOpen(): Unit = {
+ if (closed)
+ throw new IOException("Operation on closed stream")
+ }
+
+}