symbian-qemu-0.9.1-12/python-2.6.1/Demo/classes/Rev.py
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/Demo/classes/Rev.py	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,95 @@
+'''
+A class which presents the reverse of a sequence without duplicating it.
+From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
+
+It works on mutable or inmutable sequences.
+
+>>> chars = list(Rev('Hello World!'))
+>>> print ''.join(chars)
+!dlroW olleH
+
+The .forw is so you can use anonymous sequences in __init__, and still
+keep a reference the forward sequence. )
+If you give it a non-anonymous mutable sequence, the reverse sequence
+will track the updated values. ( but not reassignment! - another
+good reason to use anonymous values in creating the sequence to avoid
+confusion. Maybe it should be change to copy input sequence to break
+the connection completely ? )
+
+>>> nnn = range(3)
+>>> rnn = Rev(nnn)
+>>> for n in rnn: print n
+...
+2
+1
+0
+>>> for n in range(4, 6): nnn.append(n)   # update nnn
+...
+>>> for n in rnn: print n     # prints reversed updated values
+...
+5
+4
+2
+1
+0
+>>> nnn = nnn[1:-1]
+>>> nnn
+[1, 2, 4]
+>>> for n in rnn: print n     # prints reversed values of old nnn
+...
+5
+4
+2
+1
+0
+
+#
+>>> WH = Rev('Hello World!')
+>>> print WH.forw, WH.back
+Hello World! !dlroW olleH
+>>> nnn = Rev(range(1, 10))
+>>> print nnn.forw
+[1, 2, 3, 4, 5, 6, 7, 8, 9]
+>>> print nnn.back
+[9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+>>> rrr = Rev(nnn)
+>>> rrr
+<1, 2, 3, 4, 5, 6, 7, 8, 9>
+
+'''
+
+class Rev:
+    def __init__(self, seq):
+        self.forw = seq
+        self.back = self
+
+    def __len__(self):
+        return len(self.forw)
+
+    def __getitem__(self, j):
+        return self.forw[-(j + 1)]
+
+    def __repr__(self):
+        seq = self.forw
+        if isinstance(seq, list):
+            wrap = '[]'
+            sep = ', '
+        elif isinstance(seq, tuple):
+            wrap = '()'
+            sep = ', '
+        elif isinstance(seq, str):
+            wrap = ''
+            sep = ''
+        else:
+            wrap = '<>'
+            sep = ', '
+        outstrs = [str(item) for item in self.back]
+        return wrap[:1] + sep.join(outstrs) + wrap[-1:]
+
+def _test():
+    import doctest, Rev
+    return doctest.testmod(Rev)
+
+if __name__ == "__main__":
+    _test()