Initial check-in
[dygraphs.git] / mochikit_v14 / doc / html / MochiKit / Iter.html
CommitLineData
6a1aa64f
DV
1<?xml version="1.0" encoding="utf-8" ?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5<head>
6<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7<meta name="generator" content="Docutils 0.4: http://docutils.sourceforge.net/" />
8<title>MochiKit.Iter - itertools for JavaScript; iteration made HARD, and then easy</title>
9
10<link rel="stylesheet" href="../../../include/css/documentation.css" type="text/css" />
11<script type="text/javascript" src="../../../packed/MochiKit/MochiKit.js"></script>
12<script type="text/javascript" src="../../js/toc.js"></script>
13</head>
14<body>
15<div class="document">
16<div class="section">
17<h1><a id="name" name="name">Name</a></h1>
18<p>MochiKit.Iter - itertools for JavaScript; iteration made HARD, and
19then easy</p>
20</div>
21<div class="section">
22<h1><a id="synopsis" name="synopsis">Synopsis</a></h1>
23<pre class="literal-block">
24theSum = sum(takewhile(
25 partial(operator.gt, 10),
26 imap(
27 partial(operator.mul, 2),
28 count()
29 )
30 )
31));
32
33assert( theSum == (0 + 0 + 2 + 4 + 6 + 8) );
34</pre>
35</div>
36<div class="section">
37<h1><a id="description" name="description">Description</a></h1>
38<p>All of the functional programming missing from
39<a class="mochiref reference" href="Base.html">MochiKit.Base</a> lives here. The functionality in this module
40is largely inspired by Python's iteration protocol <a class="footnote-reference" href="#id4" id="id1" name="id1">[1]</a>, and the
41itertools module <a class="footnote-reference" href="#id5" id="id2" name="id2">[2]</a>.</p>
42<p>MochiKit.Iter defines a standard way to iterate over anything, that
43you can extend with <a class="mochiref reference" href="#fn-registeriterator">registerIterator</a>, or by implementing
44the <tt class="docutils literal"><span class="pre">.iter()</span></tt> or <tt class="docutils literal"><span class="pre">.__iterator__()</span></tt> (in MochiKit 1.4+) protocol.
45Iterators are lazy, so it can potentially be
46cheaper to build a filter chain of iterators than to build lots of
47intermediate arrays. Especially when the data set is very large, but
48the result is not.</p>
49</div>
50<div class="section">
51<h1><a id="dependencies" name="dependencies">Dependencies</a></h1>
52<ul class="simple">
53<li><a class="mochiref reference" href="Base.html">MochiKit.Base</a></li>
54</ul>
55</div>
56<div class="section">
57<h1><a id="overview" name="overview">Overview</a></h1>
58<div class="section">
59<h2><a id="iteration-for-javascript" name="iteration-for-javascript">Iteration for JavaScript</a></h2>
60<p>The best overview right now is in my Iteration for JavaScript <a class="footnote-reference" href="#id6" id="id3" name="id3">[3]</a>
61blog entry. This information will migrate here eventually.</p>
62</div>
63</div>
64<div class="section">
65<h1><a id="api-reference" name="api-reference">API Reference</a></h1>
66<div class="section">
67<h2><a id="errors" name="errors">Errors</a></h2>
68<p>
69<a name="fn-stopiteration"></a>
70<a class="mochidef reference" href="#fn-stopiteration">StopIteration</a>:</p>
71<blockquote>
72<p>The singleton <a class="mochiref reference" href="Base.html#fn-namederror">MochiKit.Base.NamedError</a> that signifies
73the end of an iterator</p>
74<dl class="docutils">
75<dt><em>Availability</em>:</dt>
76<dd>Available in MochiKit 1.3.1+</dd>
77</dl>
78</blockquote>
79</div>
80<div class="section">
81<h2><a id="functions" name="functions">Functions</a></h2>
82<p>
83<a name="fn-applymap"></a>
84<a class="mochidef reference" href="#fn-applymap">applymap(fun, seq[, self])</a>:</p>
85<blockquote>
86<p><tt class="docutils literal"><span class="pre">applymap(fun,</span> <span class="pre">seq)</span></tt> --&gt;
87fun.apply(self, seq0), fun.apply(self, seq1), ...</p>
88<dl class="docutils">
89<dt><em>Availability</em>:</dt>
90<dd>Available in MochiKit 1.3.1+</dd>
91</dl>
92</blockquote>
93<p>
94<a name="fn-chain"></a>
95<a class="mochidef reference" href="#fn-chain">chain(p, q[, ...])</a>:</p>
96<blockquote>
97<p><tt class="docutils literal"><span class="pre">chain(p,</span> <span class="pre">q,</span> <span class="pre">...)</span></tt> --&gt; p0, p1, ... plast, q0, q1, ...</p>
98<dl class="docutils">
99<dt><em>Availability</em>:</dt>
100<dd>Available in MochiKit 1.3.1+</dd>
101</dl>
102</blockquote>
103<p>
104<a name="fn-count"></a>
105<a class="mochidef reference" href="#fn-count">count(n=0)</a>:</p>
106<blockquote>
107<p><tt class="docutils literal"><span class="pre">count(n=0)</span></tt> --&gt; n, n + 1, n + 2, ...</p>
108<dl class="docutils">
109<dt><em>Availability</em>:</dt>
110<dd>Available in MochiKit 1.3.1+</dd>
111</dl>
112</blockquote>
113<p>
114<a name="fn-cycle"></a>
115<a class="mochidef reference" href="#fn-cycle">cycle(p)</a>:</p>
116<blockquote>
117<p><tt class="docutils literal"><span class="pre">cycle(p)</span></tt> --&gt; p0, p1, ... plast, p0, p1, ...</p>
118<dl class="docutils">
119<dt><em>Availability</em>:</dt>
120<dd>Available in MochiKit 1.3.1+</dd>
121</dl>
122</blockquote>
123<p>
124<a name="fn-dropwhile"></a>
125<a class="mochidef reference" href="#fn-dropwhile">dropwhile(pred, seq)</a>:</p>
126<blockquote>
127<p><tt class="docutils literal"><span class="pre">dropwhile(pred,</span> <span class="pre">seq)</span></tt> --&gt; seq[n], seq[n + 1], starting when
128pred(seq[n]) fails</p>
129<dl class="docutils">
130<dt><em>Availability</em>:</dt>
131<dd>Available in MochiKit 1.3.1+</dd>
132</dl>
133</blockquote>
134<p>
135<a name="fn-every"></a>
136<a class="mochidef reference" href="#fn-every">every(iterable, func)</a>:</p>
137<blockquote>
138<p>Return <tt class="docutils literal"><span class="pre">true</span></tt> if <tt class="docutils literal"><span class="pre">func(item)</span></tt> is <tt class="docutils literal"><span class="pre">true</span></tt> for every item in
139<tt class="docutils literal"><span class="pre">iterable</span></tt>.</p>
140<dl class="docutils">
141<dt><em>Availability</em>:</dt>
142<dd>Available in MochiKit 1.3.1+</dd>
143</dl>
144</blockquote>
145<p>
146<a name="fn-exhaust"></a>
147<a class="mochidef reference" href="#fn-exhaust">exhaust(iterable)</a>:</p>
148<blockquote>
149<p>Exhausts an iterable without saving the results anywhere, like
150<a class="mochiref reference" href="#fn-list">list(iterable)</a> when you don't care what the output is.</p>
151<dl class="docutils">
152<dt><em>Availability</em>:</dt>
153<dd>Available in MochiKit 1.3.1+</dd>
154</dl>
155</blockquote>
156<p>
157<a name="fn-foreach"></a>
158<a class="mochidef reference" href="#fn-foreach">forEach(iterable, func[, self])</a>:</p>
159<blockquote>
160<p>Call <tt class="docutils literal"><span class="pre">func</span></tt> for each item in <tt class="docutils literal"><span class="pre">iterable</span></tt>, and don't save the
161results.</p>
162<dl class="docutils">
163<dt><em>Availability</em>:</dt>
164<dd>Available in MochiKit 1.3.1+</dd>
165</dl>
166</blockquote>
167<p>
168<a name="fn-groupby"></a>
169<a class="mochidef reference" href="#fn-groupby">groupby(iterable[, keyfunc])</a>:</p>
170<blockquote>
171<p>Make an iterator that returns consecutive keys and groups from the
172iterable. The key is a function computing a key value for each
173element. If not specified or is None, key defaults to an identity
174function and returns the element unchanged. Generally, the
175iterable needs to already be sorted on the same key function.</p>
176<p>The returned group is itself an iterator that shares the
177underlying iterable with <a class="mochiref reference" href="#fn-groupby">groupby()</a>. Because the source
178is shared, when the groupby object is advanced, the previous group
179is no longer visible. So, if that data is needed later, it should
180be stored as an array:</p>
181<pre class="literal-block">
182var groups = [];
183var uniquekeys = [];
184forEach(groupby(data, keyfunc), function (key_group) {
185 groups.push(list(key_group[1]));
186 uniquekeys.push(key_group[0]);
187});
188</pre>
189<p>As a convenience, <a class="mochiref reference" href="#fn-groupby_as_array">groupby_as_array()</a> is provided to
190suit the above use case.</p>
191<dl class="docutils">
192<dt><em>Availability</em>:</dt>
193<dd>Available in MochiKit 1.3.1+</dd>
194</dl>
195</blockquote>
196<p>
197<a name="fn-groupby_as_array"></a>
198<a class="mochidef reference" href="#fn-groupby_as_array">groupby_as_array(iterable[, keyfunc])</a>:</p>
199<blockquote>
200<p>Perform the same task as <a class="mochiref reference" href="#fn-groupby">groupby()</a>, except return an
201array of arrays instead of an iterator of iterators.</p>
202<dl class="docutils">
203<dt><em>Availability</em>:</dt>
204<dd>Available in MochiKit 1.3.1+</dd>
205</dl>
206</blockquote>
207<p>
208<a name="fn-iextend"></a>
209<a class="mochidef reference" href="#fn-iextend">iextend(lst, iterable)</a>:</p>
210<blockquote>
211<p>Just like <a class="mochiref reference" href="#fn-list">list(iterable)</a>, except it pushes results on
212<tt class="docutils literal"><span class="pre">lst</span></tt> rather than creating a new one.</p>
213<dl class="docutils">
214<dt><em>Availability</em>:</dt>
215<dd>Available in MochiKit 1.3.1+</dd>
216</dl>
217</blockquote>
218<p>
219<a name="fn-ifilter"></a>
220<a class="mochidef reference" href="#fn-ifilter">ifilter(pred, seq)</a>:</p>
221<blockquote>
222<p><tt class="docutils literal"><span class="pre">ifilter(pred,</span> <span class="pre">seq)</span></tt> --&gt; elements of seq where <tt class="docutils literal"><span class="pre">pred(elem)</span></tt> is
223<tt class="docutils literal"><span class="pre">true</span></tt></p>
224<dl class="docutils">
225<dt><em>Availability</em>:</dt>
226<dd>Available in MochiKit 1.3.1+</dd>
227</dl>
228</blockquote>
229<p>
230<a name="fn-ifilterfalse"></a>
231<a class="mochidef reference" href="#fn-ifilterfalse">ifilterfalse(pred, seq)</a>:</p>
232<blockquote>
233<p><tt class="docutils literal"><span class="pre">ifilterfalse(pred,</span> <span class="pre">seq)</span></tt> --&gt; elements of seq where
234<tt class="docutils literal"><span class="pre">pred(elem)</span></tt> is <tt class="docutils literal"><span class="pre">false</span></tt></p>
235<dl class="docutils">
236<dt><em>Availability</em>:</dt>
237<dd>Available in MochiKit 1.3.1+</dd>
238</dl>
239</blockquote>
240<p>
241<a name="fn-imap"></a>
242<a class="mochidef reference" href="#fn-imap">imap(fun, p, q[, ...])</a>:</p>
243<blockquote>
244<p><tt class="docutils literal"><span class="pre">imap(fun,</span> <span class="pre">p,</span> <span class="pre">q,</span> <span class="pre">...)</span></tt> --&gt; fun(p0, q0, ...), fun(p1, q1, ...),
245...</p>
246<dl class="docutils">
247<dt><em>Availability</em>:</dt>
248<dd>Available in MochiKit 1.3.1+</dd>
249</dl>
250</blockquote>
251<p>
252<a name="fn-islice"></a>
253<a class="mochidef reference" href="#fn-islice">islice(seq, [start,] stop[, step])</a>:</p>
254<blockquote>
255<p><tt class="docutils literal"><span class="pre">islice(seq,</span> <span class="pre">[start,]</span> <span class="pre">stop[,</span> <span class="pre">step])</span></tt> --&gt; elements from
256seq[start:stop:step] (in Python slice syntax)</p>
257<dl class="docutils">
258<dt><em>Availability</em>:</dt>
259<dd>Available in MochiKit 1.3.1+</dd>
260</dl>
261</blockquote>
262<p>
263<a name="fn-iter"></a>
264<a class="mochidef reference" href="#fn-iter">iter(iterable[, sentinel])</a>:</p>
265<blockquote>
266<p>Convert the given argument to an iterator (object implementing
267<tt class="docutils literal"><span class="pre">.next()</span></tt>).</p>
268<ol class="arabic simple">
269<li>If <tt class="docutils literal"><span class="pre">iterable</span></tt> is an iterator (implements <tt class="docutils literal"><span class="pre">.next()</span></tt>), then
270it will be returned as-is.</li>
271<li>If <tt class="docutils literal"><span class="pre">iterable</span></tt> is an iterator factory (implements
272<tt class="docutils literal"><span class="pre">.iter()</span></tt>), then the result of <tt class="docutils literal"><span class="pre">iterable.iter()</span></tt> will be
273returned.</li>
274<li>If <tt class="docutils literal"><span class="pre">iterable</span></tt> is a JavaScript 1.7 iterator factory (implements
275<tt class="docutils literal"><span class="pre">.__iterable__()</span></tt>), then the result of <tt class="docutils literal"><span class="pre">iterable.__iterable__()</span></tt>
276will be returned (MochiKit 1.4+).</li>
277<li>Otherwise, the iterator factory
278<a class="mochiref reference" href="Base.html#fn-adapterregistry">MochiKit.Base.AdapterRegistry</a> is used to find a
279match.</li>
280<li>If no factory is found, it will throw <tt class="docutils literal"><span class="pre">TypeError</span></tt></li>
281</ol>
282<p>Built-in iterator factories are present for Array-like objects,
283and objects that implement the <tt class="docutils literal"><span class="pre">iterateNext</span></tt> protocol (e.g. the
284result of Mozilla's <tt class="docutils literal"><span class="pre">document.evaluate</span></tt>).</p>
285<p>When used directly, using an iterator should look like this:</p>
286<pre class="literal-block">
287var it = iter(iterable);
288try {
289 while (var o = it.next()) {
290 // use o
291 }
292} catch (e) {
293 if (e != StopIteration) {
294 throw e;
295 }
296 // pass
297}
298</pre>
299<p>This is ugly, so you should use the higher order functions to work
300with iterators whenever possible.</p>
301<dl class="docutils">
302<dt><em>Availability</em>:</dt>
303<dd>Available in MochiKit 1.3.1+</dd>
304</dl>
305</blockquote>
306<p>
307<a name="fn-izip"></a>
308<a class="mochidef reference" href="#fn-izip">izip(p, q[, ...])</a>:</p>
309<blockquote>
310<p><tt class="docutils literal"><span class="pre">izip(p,</span> <span class="pre">q,</span> <span class="pre">...)</span></tt> --&gt; [p0, q0, ...], [p1, q1, ...], ...</p>
311<dl class="docutils">
312<dt><em>Availability</em>:</dt>
313<dd>Available in MochiKit 1.3.1+</dd>
314</dl>
315</blockquote>
316<p>
317<a name="fn-list"></a>
318<a class="mochidef reference" href="#fn-list">list(iterable)</a>:</p>
319<blockquote>
320<p>Convert <tt class="docutils literal"><span class="pre">iterable</span></tt> to a new <tt class="docutils literal"><span class="pre">Array</span></tt></p>
321<dl class="docutils">
322<dt><em>Availability</em>:</dt>
323<dd>Available in MochiKit 1.3.1+</dd>
324</dl>
325</blockquote>
326<p>
327<a name="fn-next"></a>
328<a class="mochidef reference" href="#fn-next">next(iterator)</a>:</p>
329<blockquote>
330<p>Return <tt class="docutils literal"><span class="pre">iterator.next()</span></tt></p>
331<dl class="docutils">
332<dt><em>Availability</em>:</dt>
333<dd>Available in MochiKit 1.3.1+</dd>
334</dl>
335</blockquote>
336<p>
337<a name="fn-range"></a>
338<a class="mochidef reference" href="#fn-range">range([start,] stop[, step])</a>:</p>
339<blockquote>
340<p>Return an iterator containing an arithmetic progression of integers.</p>
341<p><tt class="docutils literal"><span class="pre">range(i,</span> <span class="pre">j)</span></tt> returns <a class="mochiref reference" href="#fn-iter">iter([i, i + 1, i + 2, ..., j -
3421])</a></p>
343<p><tt class="docutils literal"><span class="pre">start</span></tt> (!) defaults to <tt class="docutils literal"><span class="pre">0</span></tt>. When <tt class="docutils literal"><span class="pre">step</span></tt> is given, it
344specifies the increment (or decrement). The end point is omitted!</p>
345<p>For example, <tt class="docutils literal"><span class="pre">range(4)</span></tt> returns <a class="mochiref reference" href="#fn-iter">iter([0, 1, 2, 3])</a>.
346This iterates over exactly the valid indexes for an array of 4
347elements.</p>
348<dl class="docutils">
349<dt><em>Availability</em>:</dt>
350<dd>Available in MochiKit 1.3.1+</dd>
351</dl>
352</blockquote>
353<p>
354<a name="fn-reduce"></a>
355<a class="mochidef reference" href="#fn-reduce">reduce(fn, iterable[, initial])</a>:</p>
356<blockquote>
357<p>Apply <tt class="docutils literal"><span class="pre">fn(a,</span> <span class="pre">b)</span></tt> cumulatively to the items of an iterable from
358left to right, so as to reduce the iterable to a single value.</p>
359<p>For example:</p>
360<pre class="literal-block">
361reduce(function (a, b) { return x + y; }, [1, 2, 3, 4, 5])
362</pre>
363<p>calculates:</p>
364<pre class="literal-block">
365((((1 + 2) + 3) + 4) + 5).
366</pre>
367<p>If initial is given, it is placed before the items of the sequence
368in the calculation, and serves as a default when the sequence is
369empty.</p>
370<p>Note that the above example could be written more clearly as:</p>
371<pre class="literal-block">
372reduce(operator.add, [1, 2, 3, 4, 5])
373</pre>
374<p>Or even simpler:</p>
375<pre class="literal-block">
376sum([1, 2, 3, 4, 5])
377</pre>
378<dl class="docutils">
379<dt><em>Availability</em>:</dt>
380<dd>Available in MochiKit 1.3.1+</dd>
381</dl>
382</blockquote>
383<p>
384<a name="fn-registeriteratorfactory"></a>
385<a class="mochidef reference" href="#fn-registeriteratorfactory">registerIteratorFactory(name, check, iterfactory[, override])</a>:</p>
386<blockquote>
387<p>Register an iterator factory for use with the iter function.</p>
388<p><tt class="docutils literal"><span class="pre">check</span></tt> is a <tt class="docutils literal"><span class="pre">function(a)</span></tt> that returns <tt class="docutils literal"><span class="pre">true</span></tt> if <tt class="docutils literal"><span class="pre">a</span></tt> can
389be converted into an iterator with <tt class="docutils literal"><span class="pre">iterfactory</span></tt>.</p>
390<p><tt class="docutils literal"><span class="pre">iterfactory</span></tt> is a <tt class="docutils literal"><span class="pre">function(a)</span></tt> that returns an object with a
391<tt class="docutils literal"><span class="pre">.next()</span></tt> method that returns the next value in the sequence.</p>
392<p><tt class="docutils literal"><span class="pre">iterfactory</span></tt> is guaranteed to only be called if <tt class="docutils literal"><span class="pre">check(a)</span></tt>
393returns a true value.</p>
394<p>If <tt class="docutils literal"><span class="pre">override</span></tt> is <tt class="docutils literal"><span class="pre">true</span></tt>, then it will be made the
395highest precedence iterator factory. Otherwise, the lowest.</p>
396<dl class="docutils">
397<dt><em>Availability</em>:</dt>
398<dd>Available in MochiKit 1.3.1+</dd>
399</dl>
400</blockquote>
401<p>
402<a name="fn-repeat"></a>
403<a class="mochidef reference" href="#fn-repeat">repeat(elem[, n])</a>:</p>
404<blockquote>
405<p><tt class="docutils literal"><span class="pre">repeat(elem,</span> <span class="pre">[,n])</span></tt> --&gt; elem, elem, elem, ... endlessly or up
406to n times</p>
407<dl class="docutils">
408<dt><em>Availability</em>:</dt>
409<dd>Available in MochiKit 1.3.1+</dd>
410</dl>
411</blockquote>
412<p>
413<a name="fn-reversed"></a>
414<a class="mochidef reference" href="#fn-reversed">reversed(iterable)</a>:</p>
415<blockquote>
416<p>Return a reversed array from iterable.</p>
417<dl class="docutils">
418<dt><em>Availability</em>:</dt>
419<dd>Available in MochiKit 1.3.1+</dd>
420</dl>
421</blockquote>
422<p>
423<a name="fn-some"></a>
424<a class="mochidef reference" href="#fn-some">some(iterable, func)</a>:</p>
425<blockquote>
426<p>Return <tt class="docutils literal"><span class="pre">true</span></tt> if <tt class="docutils literal"><span class="pre">func(item)</span></tt> is <tt class="docutils literal"><span class="pre">true</span></tt> for at least one
427item in <tt class="docutils literal"><span class="pre">iterable</span></tt>.</p>
428<dl class="docutils">
429<dt><em>Availability</em>:</dt>
430<dd>Available in MochiKit 1.3.1+</dd>
431</dl>
432</blockquote>
433<p>
434<a name="fn-sorted"></a>
435<a class="mochidef reference" href="#fn-sorted">sorted(iterable[, cmp])</a>:</p>
436<blockquote>
437<p>Return a sorted array from iterable.</p>
438<dl class="docutils">
439<dt><em>Availability</em>:</dt>
440<dd>Available in MochiKit 1.3.1+</dd>
441</dl>
442</blockquote>
443<p>
444<a name="fn-sum"></a>
445<a class="mochidef reference" href="#fn-sum">sum(iterable, start=0)</a>:</p>
446<blockquote>
447<p>Returns the sum of a sequence of numbers plus the value of
448parameter <tt class="docutils literal"><span class="pre">start</span></tt> (with a default of 0). When the sequence is
449empty, returns start.</p>
450<p>Equivalent to:</p>
451<pre class="literal-block">
452reduce(operator.add, iterable, start);
453</pre>
454<dl class="docutils">
455<dt><em>Availability</em>:</dt>
456<dd>Available in MochiKit 1.3.1+</dd>
457</dl>
458</blockquote>
459<p>
460<a name="fn-takewhile"></a>
461<a class="mochidef reference" href="#fn-takewhile">takewhile(pred, seq)</a>:</p>
462<blockquote>
463<p><tt class="docutils literal"><span class="pre">takewhile(pred,</span> <span class="pre">seq)</span></tt> --&gt; seq[0], seq[1], ... until
464pred(seq[n]) fails</p>
465<dl class="docutils">
466<dt><em>Availability</em>:</dt>
467<dd>Available in MochiKit 1.3.1+</dd>
468</dl>
469</blockquote>
470<p>
471<a name="fn-tee"></a>
472<a class="mochidef reference" href="#fn-tee">tee(iterable, n=2)</a>:</p>
473<blockquote>
474<p><tt class="docutils literal"><span class="pre">tee(it,</span> <span class="pre">n=2)</span></tt> --&gt; [it1, it2, it3, ... itn] splits one iterator
475into n</p>
476<dl class="docutils">
477<dt><em>Availability</em>:</dt>
478<dd>Available in MochiKit 1.3.1+</dd>
479</dl>
480</blockquote>
481</div>
482</div>
483<div class="section">
484<h1><a id="see-also" name="see-also">See Also</a></h1>
485<table class="docutils footnote" frame="void" id="id4" rules="none">
486<colgroup><col class="label" /><col /></colgroup>
487<tbody valign="top">
488<tr><td class="label"><a class="fn-backref" href="#id1" name="id4">[1]</a></td><td>The iteration protocol is described in
489PEP 234 - Iterators: <a class="reference" href="http://www.python.org/peps/pep-0234.html">http://www.python.org/peps/pep-0234.html</a></td></tr>
490</tbody>
491</table>
492<table class="docutils footnote" frame="void" id="id5" rules="none">
493<colgroup><col class="label" /><col /></colgroup>
494<tbody valign="top">
495<tr><td class="label"><a class="fn-backref" href="#id2" name="id5">[2]</a></td><td>Python's itertools
496module: <a class="reference" href="http://docs.python.org/lib/module-itertools.html">http://docs.python.org/lib/module-itertools.html</a></td></tr>
497</tbody>
498</table>
499<table class="docutils footnote" frame="void" id="id6" rules="none">
500<colgroup><col class="label" /><col /></colgroup>
501<tbody valign="top">
502<tr><td class="label"><a class="fn-backref" href="#id3" name="id6">[3]</a></td><td>Iteration in JavaScript: <a class="reference" href="http://bob.pythonmac.org/archives/2005/07/06/iteration-in-javascript/">http://bob.pythonmac.org/archives/2005/07/06/iteration-in-javascript/</a></td></tr>
503</tbody>
504</table>
505</div>
506<div class="section">
507<h1><a id="authors" name="authors">Authors</a></h1>
508<ul class="simple">
509<li>Bob Ippolito &lt;<a class="reference" href="mailto:bob&#64;redivi.com">bob&#64;redivi.com</a>&gt;</li>
510</ul>
511</div>
512<div class="section">
513<h1><a id="copyright" name="copyright">Copyright</a></h1>
514<p>Copyright 2005 Bob Ippolito &lt;<a class="reference" href="mailto:bob&#64;redivi.com">bob&#64;redivi.com</a>&gt;. This program is
515dual-licensed free software; you can redistribute it and/or modify it
516under the terms of the <a class="reference" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a> or the <a class="reference" href="http://www.opensource.org/licenses/afl-2.1.php">Academic Free License
517v2.1</a>.</p>
518</div>
519</div>
520
521</body>
522</html>