class Sequence::Sequence::Enum

Attributes

index[R]
pos[R]

Public Class Methods

new(enum=[],qsize=400,&block) click to toggle source
# File lib/sequence/enum.rb, line 142
def initialize(enum=[],qsize=400,&block)
  @extras=[]
  @extrasmutex=Mutex.new
  init(enum,qsize,&block)
end

Public Instance Methods

<<(item) click to toggle source
# File lib/sequence/enum.rb, line 169
def <<(item)
  @extrasmutex.synchronize { @extras<<item }
end
begin!() click to toggle source
# File lib/sequence/enum.rb, line 173
def begin!
  @thread.kill
  init(@enum,@q.max,&@block)
  0
end
current() click to toggle source
# File lib/sequence/enum.rb, line 191
def current
  raise EOFError if eof?
  @q.peek
rescue ThreadError:
  raise EOFError
end
each(&block) click to toggle source
# File lib/sequence/enum.rb, line 232
def each(&block)
  copy=dup
  copy.begin!
  until(copy.eof?)
    block.call copy.read1
  end
end
end?()
Alias for: eof?
eof?() click to toggle source
# File lib/sequence/enum.rb, line 227
def eof?
  Thread.pass while @q.empty? and @thread.alive?
  @q.empty? and !@thread.alive?
end
Also aliased as: end?
init(enum,qsize,&block) click to toggle source
# File lib/sequence/enum.rb, line 148
def init(enum,qsize,&block)
  @block=block
  @pos=0
  @enum=enum
  @q=q=SizedQueue.new(qsize)
  @thread=Thread.new{
    enum.each{|item| q<<item }
    block[self] if block
    i=0
    while i<@extras.size
      q.push @extrasmutex.synchronize { @extras[i] }
      i+=1
    end
  }
end
next() click to toggle source
# File lib/sequence/enum.rb, line 198
def next
  result=@q.pop
  raise EOFError if !result && eof?
  @pos+=1
  result
rescue ThreadError:
  raise EOFError
end
next?() click to toggle source
# File lib/sequence/enum.rb, line 246
def next?; !end? end
read(len) click to toggle source
# File lib/sequence/enum.rb, line 207
def read(len)
  len.zero? and return []
  raise ThreadError if @thread.status=="sleep" and @q.empty?
  result=[]
  begin #loop
    len.times{ result<<@q.pop(true) }  
    #feh, should fetch more at a time... Queue needs a #read
  rescue ThreadError:
    len-=result.length
  end until @q.empty? and result.length.zero?

ensure
  @pos+=result.length
  return result
end
read1() click to toggle source
# File lib/sequence/enum.rb, line 185
def read1
  self.next
rescue EOFError:
  return nil
end
readahead1() click to toggle source
# File lib/sequence/enum.rb, line 179
def readahead1
  current
rescue EOFError:
  return nil
end
rewind() click to toggle source

methods for Generator compatibility:

# File lib/sequence/enum.rb, line 243
def rewind; begin!; self end
size() click to toggle source
# File lib/sequence/enum.rb, line 223
def size
  @pos+@q.size
end
yield(item) click to toggle source

should only be called from inside constructor's block

# File lib/sequence/enum.rb, line 165
def yield(item)
  @q.push item    
end