// @ts-nocheck
/// * very simple input/output stream interface */
const Stream = function () {}

// input streams //////////////
/** Returns the next byte, or -1 for EOF. */
Stream.prototype.readByte = function () {
  throw new Error('abstract method readByte() not implemented')
}
/** Attempts to fill the buffer; returns number of bytes read, or
 *  -1 for EOF. */
Stream.prototype.read = function (buffer, bufOffset, length) {
  let bytesRead = 0
  while (bytesRead < length) {
    const c = this.readByte()
    if (c < 0) {
      // EOF
      return bytesRead === 0 ? -1 : bytesRead
    }
    buffer[bufOffset++] = c
    bytesRead++
  }
  return bytesRead
}
Stream.prototype.seek = function (new_pos) {
  throw new Error('abstract method seek() not implemented')
}

// output streams ///////////
Stream.prototype.writeByte = function (_byte) {
  throw new Error('abstract method readByte() not implemented')
}
Stream.prototype.write = function (buffer, bufOffset, length) {
  let i
  for (i = 0; i < length; i++) {
    this.writeByte(buffer[bufOffset++])
  }
  return length
}
Stream.prototype.flush = function () {}

module.exports = Stream
