Class: Iter
Overview
A stable iterator class. (You can reorder/remove elements in the container without affecting iteration.)
For example, to reverse all the elements in a list:
>> i = Iter.new(1..10)
>> i.each_cons(2) { |a,b| b.move_before(a) }
>> i.to_a #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
Defined Under Namespace
Classes: Elem
Instance Attribute Summary collapse
-
#container ⇒ Object
Returns the value of attribute container.
Class Method Summary collapse
Instance Method Summary collapse
- #==(other) ⇒ Object
- #each ⇒ Object
- #each_cons(num = 1) ⇒ Object (also: #iterate, #every)
-
#elem(val) ⇒ Object
Wrap a value in an Elem container.
-
#initialize(vals) ⇒ Iter
constructor
A new instance of Iter.
- #method_missing(name, *args) ⇒ Object
- #to_a ⇒ Object
Constructor Details
#initialize(vals) ⇒ Iter
Returns a new instance of Iter.
15 16 17 |
# File 'lib/epitools/iter.rb', line 15 def initialize(vals) @container = vals.map { |val| elem(val) } end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args) ⇒ Object
58 59 60 61 62 63 64 65 66 |
# File 'lib/epitools/iter.rb', line 58 def method_missing(name, *args) result = @container.send(name, *args) case result when Array Iter.from_elems result else result end end |
Instance Attribute Details
#container ⇒ Object
Returns the value of attribute container.
13 14 15 |
# File 'lib/epitools/iter.rb', line 13 def container @container end |
Class Method Details
.from_elems(elems) ⇒ Object
24 25 26 |
# File 'lib/epitools/iter.rb', line 24 def self.from_elems(elems) new([]).tap { |i| i.container = elems } end |
Instance Method Details
#==(other) ⇒ Object
28 29 30 31 32 33 34 35 |
# File 'lib/epitools/iter.rb', line 28 def ==(other) case other when Iter @container == other.container when Array @container == other end end |
#each ⇒ Object
37 38 39 40 41 42 |
# File 'lib/epitools/iter.rb', line 37 def each @container.each do |elem| yield elem elem.visited = true end end |
#each_cons(num = 1) ⇒ Object Also known as: iterate, every
44 45 46 47 48 49 |
# File 'lib/epitools/iter.rb', line 44 def each_cons(num=1) @container.each_cons(num) do |(*elems)| yield *elems elems.each { |e| e.visited = true } end end |
#elem(val) ⇒ Object
Wrap a value in an Elem container
20 21 22 |
# File 'lib/epitools/iter.rb', line 20 def elem(val) Elem.new(self, val) end |
#to_a ⇒ Object
54 55 56 |
# File 'lib/epitools/iter.rb', line 54 def to_a @container.map(&:val) end |