Grammar and stream of consciousness cleanup for Channel and Scheduler rdoc
[rbx.git] / lib / enumerator.rb
blob7c8e206b2a423c8a09fac0433a5a0516c194821b
1 # A class which provides a method `each' to be used as an Enumerable
2 # object.
4 module Enumerable
5   class Enumerator
6     include Enumerable
8     def initialize(obj,iter, *args)
9       @object = obj
10       @iter = iter
11       @iterator = @object.method(iter.to_sym)
12       @args = args
13     end
15     def each(&block)
16       @iterator.call(*@args, &block)
17     end
18   end
20   def each_cons(n, &block)
21     array = []
22     elements = self.to_a
23     while elements.size > 0 do
24       array << elements[0,n] if elements[0,n].size == n
25       elements.shift
26     end
27     array.each { |set| yield set }
28     nil
29   end
31   def enum_cons(n)
32     Enumerable::Enumerator.new(self, :each_cons, n)
33   end
35   def each_slice(slice_size, &block)
36     a = []
37     each { |element|
38       a << element
39       if a.length == slice_size
40         yield a
41         a = []
42       end
43     }
44     yield a if a.length > 0
45   end
47   def enum_slice(n)
48     Enumerable::Enumerator.new(self, :each_slice, n)
49   end
51   def enum_with_index
52     Enumerable::Enumerator.new(self, :each_with_index)
53   end
54 end
56 class Object
57   def enum_for(method, *args)
58     Enumerable::Enumerator.new(self,method,*args)
59   end
60 end