package scalaz

import java.io.InputStream

sealed trait InputStreamW extends PimpedType[InputStream] {
  import Scalaz._

  implicit def elements: Iterator[Byte] =
    new Iterator[Byte] {
      var i: Int = _
      var b = false
      var h = true

      def next = if(hasNext) {
        b = false
        i.toByte
      } else sys.error("Iterator.next (no more elements)")

      def hasNext = {
        if(b) h
        else if(h) {
          i = value.read
          b = true
          if(i == -1)
            h = false
          h
        } else false
      }
  }

  implicit def stream: Stream[Byte] = {
      val c = value.read
      if(c == -1) Stream.empty
      else Stream.cons(c.toByte, value.stream)
    }
}

trait InputStreams {
  implicit def InputStreamTo(v: InputStream): InputStreamW = new InputStreamW {
    val value = v
  }
}