The class which defines the behaviour of the ’’ template directive.
Create a new Arrow::Template::Iterator object for the given items.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 65
65: def initialize( *items )
66: if items.length == 1 && items[0].is_a?( Enumerable )
67: @items = items[0]
68: else
69: @items = items
70: end
71:
72: @iteration = nil
73: @lastItem = nil
74: @item = nil
75: @nextItem = nil
76: @iterating = false
77: @skipped = false
78: @marker = nil
79: end
Cause iteration to immediately terminate, ala the ‘break’ keyword
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 172
172: def break
173: # Jump back into the outer loop of #each
174: throw( :break ) if @iterating
175: end
The primary iteration interface.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 102
102: def each
103: items = @items.dup
104: @items = @items.entries
105: raise LocalJumpError, "no block given" unless block_given?
106:
107: #self.log.debug "Iterating over @items = %p" % [ @items ]
108:
109: # Save this point so #restart can jump back here later. This is in a
110: # loop because it needs to be remade after it's used the first time.
111: until @marker
112: @marker = callcc {|cc| cc}
113: end
114: @iterating = true
115: @iteration = 0
116:
117: # Mark the outer loop for #break
118: catch( :break ) {
119: until @iteration >= @items.length
120:
121: # Catch a skip with the number of items to skip. Unskipped
122: # iterations "skip" 0 items.
123: n = catch( :skip ) {
124: @lastItem = self.first? ? nil : @items[ @iteration - 1 ]
125: @item = @items[ @iteration ]
126: @nextItem = self.last? ? nil : @items[ @iteration + 1 ]
127:
128: if @item.is_a?( Array )
129: yield( self, *@item )
130: else
131: yield( self, @item )
132: end
133:
134: 0
135: }
136:
137: # Set the skipped flag for next iteration if we're skipping
138: @skipped = n.nonzero?
139: @iteration += n + 1
140: end
141: }
142:
143: #self.log.debug "Returning from Iterator#each"
144:
145: return @items
146: ensure
147: @items = items
148: @iteration = nil
149: @lastItem = nil
150: @item = nil
151: @nextItem = nil
152: @iterating = false
153: @skipped = false
154: @marker = nil
155: end
Return true if the current iteration is an even-numbered iteration.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 207
207: def even?
208: return !self.odd?
209: end
Returns true if the current iteration is the first one.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 193
193: def first?
194: return @iteration == 0
195: end
Returns true if the current iteration is the last one.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 213
213: def last?
214: return @iteration == @items.length - 1
215: end
Returns true if the current iteration is an odd-numbered iteration.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 200
200: def odd?
201: return @iterating && ( @iteration % 2 ).nonzero?
202: end
Redo the current iteration
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 166
166: def redo
167: throw( :skip, -1 ) if @iterating
168: end
Cause iteration to begin over again
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 179
179: def restart
180: # Call back into the continuation that was saved at the beginning of
181: # #each
182: @marker.call if @iterating
183: end
--- SEC00149
--- ""
---
- name: items
rw: RW
a_desc: |+
The list of items in this iteration
- name: iteration
rw: RW
a_desc: |+
The index of the current iteration
- name: lastItem
rw: R
a_desc: |+
The item previous to the currently iterated one. If this is the first
iteration, this will be <tt>nil</tt>.
- name: nextItem
rw: R
a_desc: |+
The item which succeeds the currently iterated one. If this is the last
iteration, this will be <tt>nil</tt>.
---
- methods:
- visibility: public
aref: M000168
name: new
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 65</span>\n\
65: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">items</span> )\n\
66: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">items</span>.<span class=\"ruby-identifier\">length</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-value\">1</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-identifier\">items</span>[<span class=\"ruby-value\">0</span>].<span class=\"ruby-identifier\">is_a?</span>( <span class=\"ruby-constant\">Enumerable</span> )\n\
67: <span class=\"ruby-ivar\">@items</span> = <span class=\"ruby-identifier\">items</span>[<span class=\"ruby-value\">0</span>]\n\
68: <span class=\"ruby-keyword kw\">else</span>\n\
69: <span class=\"ruby-ivar\">@items</span> = <span class=\"ruby-identifier\">items</span>\n\
70: <span class=\"ruby-keyword kw\">end</span>\n\
71: \n\
72: <span class=\"ruby-ivar\">@iteration</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
73: <span class=\"ruby-ivar\">@lastItem</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
74: <span class=\"ruby-ivar\">@item</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
75: <span class=\"ruby-ivar\">@nextItem</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
76: <span class=\"ruby-ivar\">@iterating</span> = <span class=\"ruby-keyword kw\">false</span>\n\
77: <span class=\"ruby-ivar\">@skipped</span> = <span class=\"ruby-keyword kw\">false</span>\n\
78: <span class=\"ruby-ivar\">@marker</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
79: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Create a <a href="Iterator.html#M000168">new</a> <a
href="Iterator.html">Arrow::Template::Iterator</a> object for the given
<tt>items</tt>.
</p>
params: ( *items )
category: Class
type: Public
- methods:
- visibility: public
aref: M000172
name: break
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 172</span>\n\
172: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">break</span>\n\
173: <span class=\"ruby-comment cmt\"># Jump back into the outer loop of #each </span>\n\
174: <span class=\"ruby-identifier\">throw</span>( <span class=\"ruby-identifier\">:break</span> ) <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@iterating</span>\n\
175: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Cause iteration to immediately terminate, ala the ‘<a
href="Iterator.html#M000172">break</a>’ keyword
</p>
params: ()
- visibility: public
aref: M000169
name: each
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 102</span>\n\
102: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">each</span>\n\
103: <span class=\"ruby-identifier\">items</span> = <span class=\"ruby-ivar\">@items</span>.<span class=\"ruby-identifier\">dup</span>\n\
104: <span class=\"ruby-ivar\">@items</span> = <span class=\"ruby-ivar\">@items</span>.<span class=\"ruby-identifier\">entries</span>\n\
105: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">LocalJumpError</span>, <span class=\"ruby-value str\">"no block given"</span> <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">block_given?</span>\n\
106: \n\
107: <span class=\"ruby-comment cmt\">#self.log.debug "Iterating over @items = %p" % [ @items ]</span>\n\
108: \n\
109: <span class=\"ruby-comment cmt\"># Save this point so #restart can jump back here later. This is in a</span>\n\
110: <span class=\"ruby-comment cmt\"># loop because it needs to be remade after it's used the first time.</span>\n\
111: <span class=\"ruby-keyword kw\">until</span> <span class=\"ruby-ivar\">@marker</span>\n\
112: <span class=\"ruby-ivar\">@marker</span> = <span class=\"ruby-identifier\">callcc</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">cc</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">cc</span>}\n\
113: <span class=\"ruby-keyword kw\">end</span>\n\
114: <span class=\"ruby-ivar\">@iterating</span> = <span class=\"ruby-keyword kw\">true</span>\n\
115: <span class=\"ruby-ivar\">@iteration</span> = <span class=\"ruby-value\">0</span>\n\
116: \n\
117: <span class=\"ruby-comment cmt\"># Mark the outer loop for #break</span>\n\
118: <span class=\"ruby-identifier\">catch</span>( <span class=\"ruby-identifier\">:break</span> ) {\n\
119: <span class=\"ruby-keyword kw\">until</span> <span class=\"ruby-ivar\">@iteration</span> <span class=\"ruby-operator\">>=</span> <span class=\"ruby-ivar\">@items</span>.<span class=\"ruby-identifier\">length</span>\n\
120: \n\
121: <span class=\"ruby-comment cmt\"># Catch a skip with the number of items to skip. Unskipped</span>\n\
122: <span class=\"ruby-comment cmt\"># iterations "skip" 0 items.</span>\n\
123: <span class=\"ruby-identifier\">n</span> = <span class=\"ruby-identifier\">catch</span>( <span class=\"ruby-identifier\">:skip</span> ) {\n\
124: <span class=\"ruby-ivar\">@lastItem</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">first?</span> <span class=\"ruby-value\">? </span><span class=\"ruby-keyword kw\">nil</span> <span class=\"ruby-operator\">:</span> <span class=\"ruby-ivar\">@items</span>[ <span class=\"ruby-ivar\">@iteration</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-value\">1</span> ]\n\
125: <span class=\"ruby-ivar\">@item</span> = <span class=\"ruby-ivar\">@items</span>[ <span class=\"ruby-ivar\">@iteration</span> ]\n\
126: <span class=\"ruby-ivar\">@nextItem</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">last?</span> <span class=\"ruby-value\">? </span><span class=\"ruby-keyword kw\">nil</span> <span class=\"ruby-operator\">:</span> <span class=\"ruby-ivar\">@items</span>[ <span class=\"ruby-ivar\">@iteration</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-value\">1</span> ]\n\
127: \n\
128: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@item</span>.<span class=\"ruby-identifier\">is_a?</span>( <span class=\"ruby-constant\">Array</span> )\n\
129: <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-keyword kw\">self</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-ivar\">@item</span> )\n\
130: <span class=\"ruby-keyword kw\">else</span>\n\
131: <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-keyword kw\">self</span>, <span class=\"ruby-ivar\">@item</span> )\n\
132: <span class=\"ruby-keyword kw\">end</span>\n\
133: \n\
134: <span class=\"ruby-value\">0</span>\n\
135: }\n\
136: \n\
137: <span class=\"ruby-comment cmt\"># Set the skipped flag for next iteration if we're skipping</span>\n\
138: <span class=\"ruby-ivar\">@skipped</span> = <span class=\"ruby-identifier\">n</span>.<span class=\"ruby-identifier\">nonzero?</span>\n\
139: <span class=\"ruby-ivar\">@iteration</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-identifier\">n</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-value\">1</span>\n\
140: <span class=\"ruby-keyword kw\">end</span>\n\
141: }\n\
142: \n\
143: <span class=\"ruby-comment cmt\">#self.log.debug "Returning from Iterator#each"</span>\n\
144: \n\
145: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@items</span>\n\
146: <span class=\"ruby-keyword kw\">ensure</span>\n\
147: <span class=\"ruby-ivar\">@items</span> = <span class=\"ruby-identifier\">items</span>\n\
148: <span class=\"ruby-ivar\">@iteration</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
149: <span class=\"ruby-ivar\">@lastItem</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
150: <span class=\"ruby-ivar\">@item</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
151: <span class=\"ruby-ivar\">@nextItem</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
152: <span class=\"ruby-ivar\">@iterating</span> = <span class=\"ruby-keyword kw\">false</span>\n\
153: <span class=\"ruby-ivar\">@skipped</span> = <span class=\"ruby-keyword kw\">false</span>\n\
154: <span class=\"ruby-ivar\">@marker</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
155: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
The primary iteration interface.
</p>
params: () {|self, *@item| ...}
- visibility: public
aref: M000177
name: even?
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 207</span>\n\
207: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">even?</span>\n\
208: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">odd?</span>\n\
209: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Return <tt>true</tt> if the current iteration is an even-numbered
iteration.
</p>
params: ()
- visibility: public
aref: M000175
name: first?
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 193</span>\n\
193: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">first?</span>\n\
194: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@iteration</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-value\">0</span>\n\
195: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Returns <tt>true</tt> if the current iteration is the first one.
</p>
params: ()
- visibility: public
aref: M000178
name: last?
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 213</span>\n\
213: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">last?</span>\n\
214: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@iteration</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-ivar\">@items</span>.<span class=\"ruby-identifier\">length</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-value\">1</span>\n\
215: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Returns <tt>true</tt> if the current iteration is the last one.
</p>
params: ()
- visibility: public
aref: M000176
name: odd?
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 200</span>\n\
200: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">odd?</span>\n\
201: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@iterating</span> <span class=\"ruby-operator\">&&</span> ( <span class=\"ruby-ivar\">@iteration</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-value\">2</span> ).<span class=\"ruby-identifier\">nonzero?</span>\n\
202: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Returns <tt>true</tt> if the current iteration is an odd-numbered
iteration.
</p>
params: ()
- visibility: public
aref: M000171
name: redo
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 166</span>\n\
166: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">redo</span>\n\
167: <span class=\"ruby-identifier\">throw</span>( <span class=\"ruby-identifier\">:skip</span>, <span class=\"ruby-value\">-1</span> ) <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@iterating</span>\n\
168: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Redo the current iteration
</p>
params: ()
- visibility: public
aref: M000173
name: restart
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 179</span>\n\
179: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">restart</span>\n\
180: <span class=\"ruby-comment cmt\"># Call back into the continuation that was saved at the beginning of</span>\n\
181: <span class=\"ruby-comment cmt\"># #each</span>\n\
182: <span class=\"ruby-ivar\">@marker</span>.<span class=\"ruby-identifier\">call</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@iterating</span>\n\
183: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Cause iteration to begin over again
</p>
params: ()
- visibility: public
aref: M000170
name: skip
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 159</span>\n\
159: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">skip</span>( <span class=\"ruby-identifier\">n</span>=<span class=\"ruby-value\">1</span> )\n\
160: <span class=\"ruby-comment cmt\"># Jump back into #each with the number of iterations to skip</span>\n\
161: <span class=\"ruby-identifier\">throw</span>( <span class=\"ruby-identifier\">:skip</span>, <span class=\"ruby-identifier\">n</span> ) <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@iterating</span>\n\
162: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Cause the next <tt>n</tt> items to be skipped
</p>
params: ( n=1 )
- visibility: public
aref: M000174
name: skipped?
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 187</span>\n\
187: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">skipped?</span>\n\
188: <span class=\"ruby-ivar\">@skipped</span>\n\
189: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Returns <tt>true</tt> if the last iteration skipped one or more items.
</p>
params: ()
category: Instance
type: Public
---
---
- name: SVNRev
desc: |+
SVN Revision
value: "%q$Rev: 437 $"
- name: SVNId
desc: |+
SVN Id
value: "%q$Id: iterator.rb 437 2008-03-28 00:49:20Z deveiant $"
Generated with the Darkfish Rdoc Generator.