Skip to content

Commit db7742b

Browse files
committed
-
1 parent c251cb7 commit db7742b

File tree

2 files changed

+43
-8
lines changed

2 files changed

+43
-8
lines changed

source_py3/python_toolbox/nifty_collections/various_ordered_sets.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
# This program is distributed under the MIT license.
33

44
import collections
5+
import operator
6+
import itertools
57

68
from python_toolbox import comparison_tools
79
from python_toolbox import context_management
@@ -61,10 +63,9 @@ def __repr__(self):
6163

6264
def __eq__(self, other):
6365
return (
64-
isinstance(other, collections.Set) and
65-
isinstance(other, collections.Sequence) and
66-
len(self) == len(other) and
67-
tuple(self) == tuple(other)
66+
(type(self) is type(other)) and
67+
(len(self) == len(other)) and
68+
all(itertools.starmap(operator.eq, zip(self, other)))
6869
)
6970

7071
def __clear(self):
@@ -102,6 +103,10 @@ class FrozenOrderedSet(BaseOrderedSet):
102103
creation) except items have an order. (By default they're ordered by
103104
insertion order, but that order can be changed.)
104105
'''
106+
107+
def __hash__(self):
108+
return hash((type(self), tuple(self)))
109+
105110

106111

107112
class OrderedSet(BaseOrderedSet, collections.MutableSet):
@@ -218,4 +223,17 @@ def move_to_end(self, key, last=True):
218223
self.remove(key)
219224
self.add(key, last=last)
220225

221-
_emitter_freezer = freezing.FreezerProperty()
226+
_emitter_freezer = freezing.FreezerProperty()
227+
228+
def __eq__(self, other):
229+
return (
230+
(type(self) is type(other)) and
231+
(len(self) == len(other)) and
232+
(self.emitter is other.emitter) and
233+
all(itertools.starmap(operator.eq, zip(self, other)))
234+
)
235+
236+
def get_without_emitter(self):
237+
'''Get a version of this ordered set without an emitter attached.'''
238+
return OrderedSet(self)
239+

source_py3/test_python_toolbox/test_nifty_collections/test_various_ordered_sets.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ def test_operations(self):
1919
assert type(ordered_set | ordered_set) == \
2020
type(ordered_set & ordered_set) == type(ordered_set)
2121

22+
def test_bool(self):
23+
assert bool(self.ordered_set_type({})) is False
24+
assert bool(self.ordered_set_type({0})) is True
25+
assert bool(self.ordered_set_type(range(5))) is True
26+
27+
2228
class BaseMutableOrderedSetTestCase(BaseOrderedSetTestCase):
2329
__test__ = False
2430
def test_sort(self):
@@ -91,7 +97,16 @@ def test_frozen(self):
9197
assert list(frozen_ordered_set) == list(range(4))
9298

9399
def test_hashable(self):
94-
1 / 0blocktodo
100+
d = {
101+
FrozenOrderedSet(range(1)): 1,
102+
FrozenOrderedSet(range(2)): 2,
103+
FrozenOrderedSet(range(3)): 3,
104+
}
105+
assert len(d) == 3
106+
assert set(d.values()) == {1, 2, 3}
107+
assert d[FrozenOrderedSet(range(2))] == 2
108+
d[FrozenOrderedSet(range(2))] = 20
109+
assert set(d.values()) == {1, 20, 3}
95110

96111

97112
class EmittingOrderedSetTestCase(BaseMutableOrderedSetTestCase):
@@ -110,12 +125,14 @@ def increment_times_emitted():
110125
assert times_emitted == [1]
111126
emitting_ordered_set.discard(17)
112127
assert times_emitted == [1]
113-
assert emitting_ordered_set == OrderedSet(range(8))
128+
assert emitting_ordered_set.get_without_emitter() == \
129+
OrderedSet(range(8))
114130
emitting_ordered_set |= (8, 9, 10)
115131
assert times_emitted == [4]
116132
emitting_ordered_set |= (8, 9, 10)
117133
assert times_emitted == [4]
118-
assert emitting_ordered_set == OrderedSet(range(11))
134+
assert emitting_ordered_set.get_without_emitter() == \
135+
OrderedSet(range(11))
119136
emitting_ordered_set.move_to_end(4)
120137
assert times_emitted == [5]
121138
assert tuple(emitting_ordered_set) == \

0 commit comments

Comments
 (0)