~olivier-berten/swatchbooker/trunk

« back to all changes in this revision

Viewing changes to src/swatchbook/__init__.py

  • Committer: Olivier Berten
  • Date: 2011-02-06 10:42:33 UTC
  • Revision ID: olivier.berten@gmail.com-20110206104233-23995hfuw3df9pyy
SortedDict updates from the Django project

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
        def __init__(self, data=None):
46
46
                if data is None:
47
47
                        data = {}
 
48
                elif isinstance(data, GeneratorType):
 
49
                        # Unfortunately we need to be able to read a generator twice.  Once
 
50
                        # to get the data into self with our super().__init__ call and a
 
51
                        # second time to setup keyOrder correctly
 
52
                        data = list(data)
48
53
                super(SortedDict, self).__init__(data)
49
54
                if isinstance(data, dict):
50
55
                        self.keyOrder = data.keys()
51
56
                else:
52
57
                        self.keyOrder = []
 
58
                        seen = set()
53
59
                        for key, value in data:
54
 
                                if key not in self.keyOrder:
 
60
                                if key not in seen:
55
61
                                        self.keyOrder.append(key)
 
62
                                        seen.add(key)
56
63
 
57
64
        def __deepcopy__(self, memo):
58
 
                from copy import deepcopy
59
65
                return self.__class__([(key, deepcopy(value, memo))
60
66
                                                           for key, value in self.iteritems()])
61
67
 
62
68
        def __setitem__(self, key, value):
 
69
                if key not in self:
 
70
                        self.keyOrder.append(key)
63
71
                super(SortedDict, self).__setitem__(key, value)
64
 
                if key not in self.keyOrder:
65
 
                        self.keyOrder.append(key)
66
72
 
67
73
        def __delitem__(self, key):
68
74
                super(SortedDict, self).__delitem__(key)
69
75
                self.keyOrder.remove(key)
70
76
 
71
77
        def __iter__(self):
72
 
                for k in self.keyOrder:
73
 
                        yield k
 
78
                return iter(self.keyOrder)
74
79
 
75
80
        def pop(self, k, *args):
76
81
                result = super(SortedDict, self).pop(k, *args)
91
96
 
92
97
        def iteritems(self):
93
98
                for key in self.keyOrder:
94
 
                        yield key, super(SortedDict, self).__getitem__(key)
 
99
                        yield key, self[key]
95
100
 
96
101
        def keys(self):
97
102
                return self.keyOrder[:]
100
105
                return iter(self.keyOrder)
101
106
 
102
107
        def values(self):
103
 
                return [super(SortedDict, self).__getitem__(k) for k in self.keyOrder]
 
108
                return map(self.__getitem__, self.keyOrder)
104
109
 
105
110
        def itervalues(self):
106
111
                for key in self.keyOrder:
107
 
                        yield super(SortedDict, self).__getitem__(key)
 
112
                        yield self[key]
108
113
 
109
114
        def update(self, dict_):
110
 
                for k, v in dict_.items():
111
 
                        self.__setitem__(k, v)
 
115
                for k, v in dict_.iteritems():
 
116
                        self[k] = v
112
117
 
113
118
        def setdefault(self, key, default):
114
 
                if key not in self.keyOrder:
 
119
                if key not in self:
115
120
                        self.keyOrder.append(key)
116
121
                return super(SortedDict, self).setdefault(key, default)
117
122