From: ahoward Date: 2002-11-20T04:09:56+09:00 Subject: Re: Thoughts on generators On 19 Nov 2002, Martin DeMello wrote: [snip] M> Has anyone done something like this already? [snip] i have been using this. the iterator is compliments of Pit Capitain. this doesn't work with threads but i learned a lot from it... eg. a = ['fee','fie','foe','fum'] h = {0 => 'fee', 1 => 'fie', 2 => 'fum', 3 => 'fum'} ai = a.iterator hi = h.iterator while ((n = ai.next)) do print n.inspect, ' ' end; print "\n" # >> "fee" "fie" "foe" "fum" while ((n = hi.next)) do print n.inspect, ' ' end; print "\n" # >> [0, "fee"] [1, "fie"] [2, "fum"] [3, "fum"] each a, h do |elem, kv| print elem.inspect, ' ', kv.inspect, ' ' end; print "\n" # >> "fee" [0, "fee"] "fie" [1, "fie"] "foe" [2, "fum"] "fum" [3, "fum"] source. --------cut-------- module Enumerable class Iterator public attr_reader :enumerable, :has_next def initialize enumerable, end_value = nil, &end_block @enumerable = enumerable @end_value = end_value @end_block = end_block initialize_fetch_block end def next @has_next ? fetch_next_element : fetch_end_value end def rewind initialize_fetch_block self end protected def initialize_fetch_block callcc do |@after_fetch| @has_next = true @enumerable.each do |@next_element| callcc do |@next_fetch| @after_fetch.call end end @has_next = false @next_fetch = nil @after_fetch.call end @after_fetch = nil end def fetch_next_element result = @next_element callcc do |@after_fetch| @next_fetch.call end @after_fetch = nil result end def fetch_end_value @end_block ? @end_block.call : @end_value end end def iterator @iterator = Iterator.new self end end module Kernel def each(*enumerables, &block) iterators = enumerables.collect{|e| e.iterator} while true args = iterators.collect{|i| i.next} if args.detect{|arg| arg} block.call *args else return enumerables end end end end --------cut-------- -ara -- ==================================== | Ara Howard | NOAA Forecast Systems Laboratory | Information and Technology Services | Data Systems Group | R/FST 325 Broadway | Boulder, CO 80305-3328 | Email: ahoward@fsl.noaa.gov | Phone: 303-497-7238 | Fax: 303-497-7259 ====================================