Jump To …

RandomAccessLoggableIterator.coffee

EventEmitter = (require 'events').EventEmitter
Addr64 = (require './Addr64.coffee').Addr64
LogUtil = (require './LogUtil.coffee').LogUtil
UnsupportedOperationError =
  (require '../errors/UnsupportedOperationError.coffee').
  UnsupportedOperationError

Stops at the end of log or on the file hole.

class RandomAccessLoggableIterator extends EventEmitter

@private

  log: undefined

@private

  address: undefined

Constructor.

@param log @param startAddress

  @create$Log$Addr64: (log, startAddress, o) ->
    if !o? then o = new RandomAccessLoggableIterator
    o.log = log
    o.address = startAddress
    return o

  getHighAddress: () ->
    return @address

Get next element.

@return next loggable or undefined. If undefined 'next' event is emitted.

  next$emit: () ->
    finish = (result) =>
      @emit 'next', result
    onNext = (result) =>
      @address = @address.plus$int result.length()
      finish result
    addrString = Addr64.
    addr64ToString$Addr64$int(@address, LogUtil.LOG_NAME_BASE)
    @log.once 'read' + addrString, (result) =>
      onNext result
    result = @log.read$Addr64$emit @address
    if result?
      @log.removeAllListeners 'read' + addrString
      onNext result
    else
      return undefined

  hasNext: () ->
    return @log.hasAddress$Addr64 @address

  remove: () ->
    throw new UnsupportedOperationError()

exports.RandomAccessLoggableIterator = RandomAccessLoggableIterator