File indexing completed on 2023-03-17 11:03:23
0001 from __future__ import print_function
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 import collections.abc
0028
0029 class OrderedSet(collections.abc.MutableSet):
0030
0031 def __init__(self, iterable=None):
0032 self.end = end = []
0033 end += [None, end, end]
0034 self.map = {}
0035 if iterable is not None:
0036 self |= iterable
0037
0038 def __len__(self):
0039 return len(self.map)
0040
0041 def __contains__(self, key):
0042 return key in self.map
0043
0044 def add(self, key):
0045 if key not in self.map:
0046 end = self.end
0047 curr = end[1]
0048 curr[2] = end[1] = self.map[key] = [key, curr, end]
0049
0050 def discard(self, key):
0051 if key in self.map:
0052 key, prev, next = self.map.pop(key)
0053 prev[2] = next
0054 next[1] = prev
0055
0056 def __iter__(self):
0057 end = self.end
0058 curr = end[2]
0059 while curr is not end:
0060 yield curr[0]
0061 curr = curr[2]
0062
0063 def __reversed__(self):
0064 end = self.end
0065 curr = end[1]
0066 while curr is not end:
0067 yield curr[0]
0068 curr = curr[1]
0069
0070 def pop(self, last=True):
0071 if not self:
0072 raise KeyError('set is empty')
0073 key = self.end[1][0] if last else self.end[2][0]
0074 self.discard(key)
0075 return key
0076
0077 def __repr__(self):
0078 if not self:
0079 return '%s()' % (self.__class__.__name__,)
0080 return '%s(%r)' % (self.__class__.__name__, list(self))
0081
0082 def __eq__(self, other):
0083 if isinstance(other, OrderedSet):
0084 return len(self) == len(other) and list(self) == list(other)
0085 return set(self) == set(other)
0086
0087
0088 if __name__ == '__main__':
0089 import unittest
0090 class TestModuleCommand(unittest.TestCase):
0091 def setUp(self):
0092 """Nothing to do """
0093 pass
0094 def testSetOperations(self):
0095 s = OrderedSet('abracadaba')
0096 t = OrderedSet('simsalabim')
0097 self.assertEqual(str((s | t)), "OrderedSet(['a', 'b', 'r', 'c', 'd', 's', 'i', 'm', 'l'])")
0098 self.assertEqual(str((s & t)), "OrderedSet(['a', 'b'])")
0099 self.assertEqual(str(s - t),"OrderedSet(['r', 'c', 'd'])")
0100 unittest.main()