Mercurial > p > roundup > code
annotate ZTUtils/Iterator.py @ 1029:c3e391d9c4e9
more FieldStorage fun
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 03 Sep 2002 07:42:38 +0000 |
| parents | 7fe79c67aaa9 |
| children |
| rev | line source |
|---|---|
|
983
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1 ############################################################################## |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
2 # |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
3 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
4 # |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
5 # This software is subject to the provisions of the Zope Public License, |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
6 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
10 # FOR A PARTICULAR PURPOSE |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
11 # |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
12 ############################################################################## |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
13 __doc__='''Iterator class |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
14 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
15 Unlike the builtin iterators of Python 2.2+, these classes are |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
16 designed to maintain information about the state of an iteration. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
17 The Iterator() function accepts either a sequence or a Python |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
18 iterator. The next() method fetches the next item, and returns |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
19 true if it succeeds. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
20 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 $Id: Iterator.py,v 1.1 2002-08-30 08:25:34 richard Exp $''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
22 __version__='$Revision: 1.1 $'[11:-2] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
23 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
24 import string |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
25 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
26 class Iterator: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
27 '''Simple Iterator class''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
28 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
29 __allow_access_to_unprotected_subobjects__ = 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
30 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
31 nextIndex = 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 def __init__(self, seq): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 self.seq = seq |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 for inner in seqInner, iterInner: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 if inner._supports(seq): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 self._inner = inner |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 self._prep_next = inner.prep_next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 return |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 raise TypeError, "Iterator does not support %s" % `seq` |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 def __getattr__(self, name): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 try: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 inner = getattr(self._inner, 'it_' + name) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 except AttributeError: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
45 raise AttributeError, name |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 return inner(self) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
48 def next(self): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
49 if not (hasattr(self, '_next') or self._prep_next(self)): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
50 return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
51 self.index = i = self.nextIndex |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
52 self.nextIndex = i+1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
53 self._advance(self) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
54 return 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 def _advance(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
57 self.item = self._next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
58 del self._next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 del self.end |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
60 self._advance = self._inner.advance |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
61 self.start = 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
62 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
63 def number(self): return self.nextIndex |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
65 def even(self): return not self.index % 2 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
66 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
67 def odd(self): return self.index % 2 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 def letter(self, base=ord('a'), radix=26): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
70 index = self.index |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 s = '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
72 while 1: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 index, off = divmod(index, radix) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
74 s = chr(base + off) + s |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 if not index: return s |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
77 def Letter(self): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
78 return self.letter(base=ord('A')) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
79 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
80 def Roman(self, rnvalues=( |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
81 (1000,'M'),(900,'CM'),(500,'D'),(400,'CD'), |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
82 (100,'C'),(90,'XC'),(50,'L'),(40,'XL'), |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
83 (10,'X'),(9,'IX'),(5,'V'),(4,'IV'),(1,'I')) ): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
84 n = self.index + 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
85 s = '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
86 for v, r in rnvalues: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
87 rct, n = divmod(n, v) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
88 s = s + r * rct |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
89 return s |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
90 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
91 def roman(self, lower=string.lower): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
92 return lower(self.Roman()) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
93 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
94 def first(self, name=None): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
95 if self.start: return 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
96 return not self.same_part(name, self._last, self.item) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
97 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
98 def last(self, name=None): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
99 if self.end: return 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
100 return not self.same_part(name, self.item, self._next) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
101 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
102 def same_part(self, name, ob1, ob2): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
103 if name is None: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
104 return ob1 == ob2 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
105 no = [] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
106 return getattr(ob1, name, no) == getattr(ob2, name, no) is not no |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
107 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
108 def __iter__(self): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
109 return IterIter(self) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
110 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
111 class InnerBase: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
112 '''Base Inner class for Iterators''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
113 # Prep sets up ._next and .end |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
114 def prep_next(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
115 it.next = self.no_next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
116 it.end = 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
117 return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
118 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
119 # Advance knocks them down |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
120 def advance(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
121 it._last = it.item |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
122 it.item = it._next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
123 del it._next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
124 del it.end |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
125 it.start = 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
126 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
127 def no_next(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
128 return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
129 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
130 def it_end(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
131 if hasattr(it, '_next'): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
132 return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
133 return not self.prep_next(it) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
134 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
135 class SeqInner(InnerBase): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
136 '''Inner class for sequence Iterators''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
137 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
138 def _supports(self, ob): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
139 try: ob[0] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
140 except TypeError: return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
141 except: pass |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
142 return 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
143 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
144 def prep_next(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
145 i = it.nextIndex |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
146 try: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
147 it._next = it.seq[i] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
148 except IndexError: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
149 it._prep_next = self.no_next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
150 it.end = 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
151 return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
152 it.end = 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
153 return 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
154 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
155 def it_length(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
156 it.length = l = len(it.seq) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
157 return l |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
158 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
159 try: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
160 StopIteration=StopIteration |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
161 except NameError: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
162 StopIteration="StopIteration" |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
163 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
164 class IterInner(InnerBase): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
165 '''Iterator inner class for Python iterators''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
166 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
167 def _supports(self, ob): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
168 try: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
169 if hasattr(ob, 'next') and (ob is iter(ob)): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
170 return 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
171 except: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
172 return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
173 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
174 def prep_next(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
175 try: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
176 it._next = it.seq.next() |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
177 except StopIteration: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
178 it._prep_next = self.no_next |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
179 it.end = 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
180 return 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
181 it.end = 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
182 return 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
183 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
184 class IterIter: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
185 def __init__(self, it): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
186 self.it = it |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
187 self.skip = it.nextIndex > 0 and not it.end |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
188 def next(self): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
189 it = self.it |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
190 if self.skip: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
191 self.skip = 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
192 return it.item |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
193 if it.next(): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
194 return it.item |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
195 raise StopIteration |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
196 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
197 seqInner = SeqInner() |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
198 iterInner = IterInner() |
