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
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