2to3 (compiles, not tested)
[tag_parser.git] / src / mjacob / collections / FrozenIndex.py
blobfb02a048e139184ff5872b13d46968ba5fbe8350
1 # This Python file uses the following encoding: utf-8
2 '''
3 Created on Jun 2, 2011
5 @author: mjacob
6 '''
7 from itertools import chain
9 class FrozenIndex(object):
10 """immutable collection of objects "indexed" by other objects"""
12 EMPTY = frozenset()
14 def __init__(self, items):
15 d = {}
16 for k,v in items:
17 if k in d:
18 d[k].append(v)
19 else:
20 d[k] = [v]
21 for k in d:
22 d[k] = frozenset(d[k])
23 self.__dict = d
24 self.__values = frozenset(list(self.values()))
25 self.__hash = hash(tuple(items))
27 def __contains__(self, k):
28 return k in self.__values
30 def __getitem__(self, k):
31 if k in self.__dict:
32 return self.__dict[k]
33 else:
34 return FrozenIndex.EMPTY
36 def __iter__(self):
37 return iter(self.values())
39 def __len__(self):
40 return len(list(self.values()))
42 def get(self, k):
43 if k in self.__dict:
44 return self.__dict.get(k)
45 else:
46 return FrozenIndex.EMPTY
48 def has_key(self, k):
49 return k in self.__dict
51 def items(self):
52 return tuple(((k,v) for k in self.__dict for v in self.__dict[k]))
54 def iteritems(self):
55 return (((k,v) for k in self.__dict for v in self.__dict[k]))
57 def iterkeys(self):
58 return iter(self.__dict.keys())
60 def itervalues(self):
61 return chain(*list(self.__dict.values()))
63 def keys(self):
64 return list(self.__dict.keys())
66 def values(self):
67 return tuple(chain(*list(self.__dict.values())))
69 def hash(self):
70 return self.__hash
72 def __eq__(self, othr):
73 return self.__dict == othr.__dict
75 def __ge__(self, othr):
76 return self.__dict >= othr.__dict
78 def __gt__(self, othr):
79 return self.__dict > othr.__dict
81 def __le__(self, othr):
82 return self.__dict <= othr.__dict
84 def __lt__(self, othr):
85 return self.__dict < othr.__dict
87 def __ne__(self, othr):
88 return self.__dict != othr.__dict
90 def __sizeof__(self):
91 return self.__dict.__sizeof__()
93 def __repr__(self):
94 return repr(self.__dict)
96 def __str__(self):
97 return str(self.__dict)