Generator implementation

I was reading the Generator implementation a few hours ago,
finding out that it’s a little hard to understand the code for me.
Then I started writing my own implementation with Continuation,
hoping I understood things well. Did it have to be that complex?

The result was shown below, and they passed the unit tests in
generator.rb.
I believed they are faster than the original implementation,
(p.s. generator.rb,v 1.2.2.2 2004/05/07 08:48:23 matz Exp $)
but was not sure if there’s something wrong.
Maybe there’s more consideration I didn’t notice before.
Please correct me if I lost something. Thank you.

And if you thought this implementation was useful, feel free to use it
under the same terms as Ruby.

class Generator
include Enumerable
def initialize enum = nil, &block
if enum
@block = lambda{|g| enum.each{|i| g.yield i}}
else
@block = block
end
@index = 0
@value = nil
if @con_next = callcc{|c|c}
@block.call self
@con_next.call
end
end

def next
    raise EOFError, "no more elements available" if end?
    @index += 1
    result = @value
    @con_yield.call if @con_next = callcc{|c|c}
    result
end

def yield value
    @value = value
    @con_next.call if @con_yield = callcc{|c|c}
end

def next?
    return true if @con_yield
    return false
end
def end?
    !next?
end
def index
    @index
end
alias_method :pos, :index
def current
    raise EOFError, "no more elements available" unless @value
    @value
end
def rewind
    initialize &@block
    self
end
def each
    rewind
    yield(self.next) while self.next?
    self
end

end

Thank you for reading.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs