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.