summaryrefslogtreecommitdiff
path: root/examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala
diff options
context:
space:
mode:
authorHaoyi Li <haoyi@haoyi-mbp.corp.dropbox.com>2014-11-26 00:45:31 -0800
committerHaoyi Li <haoyi@haoyi-mbp.corp.dropbox.com>2014-11-26 00:45:31 -0800
commit24f31e120f9537faede7a174bb09ee35f64e1ce4 (patch)
tree06ffc3ecc7847789008352b7e2b7c040dad48907 /examples/scala-js/javalib/src/main/scala/java/io/StringReader.scala
parentb89ce9cbf79363f8cab09186a5d7ba94bc0af02a (diff)
parent2c4b142503bd2d871e6818b5cab8c38627d9e4a0 (diff)
downloadhands-on-scala-js-24f31e120f9537faede7a174bb09ee35f64e1ce4.tar.gz
hands-on-scala-js-24f31e120f9537faede7a174bb09ee35f64e1ce4.tar.bz2
hands-on-scala-js-24f31e120f9537faede7a174bb09ee35f64e1ce4.zip
Merge commit '2c4b142503bd2d871e6818b5cab8c38627d9e4a0' as 'examples/scala-js'
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")
+ }
+
+}