Subversion Info

Rev
437
Last Checked In
2008-03-28 00:49:20 (2 weeks ago)
Checked in by
deveiant

Parent

Included Modules

Class Index

Quicksearch

Arrow::Template::Iterator

The class which defines the behaviour of the ’’ template directive.

Constants

SVNRev
SVN Revision
SVNId
SVN Id

Attributes

items[RW]
The list of items in this iteration
iteration[RW]
The index of the current iteration
lastItem[R]
The item previous to the currently iterated one. If this is the first iteration, this will be nil.
nextItem[R]
The item which succeeds the currently iterated one. If this is the last iteration, this will be nil.

Public Class Methods

new( *items ) click to toggle source

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

Public Instance Methods

break() click to toggle source

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
each() {|self, *@item| ...} click to toggle source

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
even?() click to toggle source

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
first?() click to toggle source

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
last?() click to toggle source

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
odd?() click to toggle source

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() click to toggle source

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
restart() click to toggle source

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
skip( n=1 ) click to toggle source

Cause the next n items to be skipped

     # File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 159
159:     def skip( n=1 )
160:         # Jump back into #each with the number of iterations to skip
161:         throw( :skip, n ) if @iterating
162:     end
skipped?() click to toggle source

Returns true if the last iteration skipped one or more items.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/template/iterator.rb, line 187
187:     def skipped?
188:         @skipped
189:     end

secsequence

--- SEC00149

seccomment

--- ""

attributes

--- 
- 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>.
    

method_list

--- 
- 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\">&amp;&amp;</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 &#8216;<a
      href="Iterator.html#M000172">break</a>&#8217; 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\">&quot;no block given&quot;</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 &quot;Iterating over @items = %p&quot; % [ @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\">&gt;=</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 &quot;skip&quot; 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 &quot;Returning from Iterator#each&quot;</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\">&amp;&amp;</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

sectitle

--- 

constants

--- 
- 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 $"

[Validate]

Generated with the Darkfish Rdoc Generator.