Skip to content

Commit e378c94

Browse files
authored
Merge pull request #419 from boriel/feature/typing_identity_set
Add typing to IdentitySet
2 parents ea24e54 + a45ffd9 commit e378c94

1 file changed

Lines changed: 29 additions & 12 deletions

File tree

src/api/identityset.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,35 @@
22
# -*- coding: utf-8 -*-
33
# vim:ts=4:et:
44

5+
from typing import Iterable
6+
from typing import Iterator
7+
from typing import Optional
8+
from typing import TypeVar
9+
from typing import Generic
10+
from typing import List
11+
from typing import Set
512

6-
class IdentitySet:
13+
14+
__all__ = ['IdentitySet']
15+
16+
T = TypeVar('T')
17+
18+
19+
class IdentitySet(Iterable[T], Generic[T]):
720
""" This set implementation only adds items
821
if they are not exactly the same (same reference)
922
preserving its order (OrderedDict). Allows deleting by ith-index.
1023
"""
11-
def __init__(self, elems=None):
12-
self.elems = []
13-
self._elems = set()
24+
def __init__(self, elems: Optional[Iterable[T]] = None):
25+
self.elems: List[T] = []
26+
self._elems: Set[T] = set()
1427
self.update(elems or [])
1528

16-
def add(self, elem):
29+
def add(self, elem: T):
1730
self.elems.append(elem)
1831
self._elems.add(elem)
1932

20-
def remove(self, elem):
33+
def remove(self, elem: T) -> bool:
2134
""" Removes an element if it exists. Otherwise does nothing.
2235
Returns if the element was removed.
2336
"""
@@ -43,17 +56,21 @@ def __contains__(self, elem):
4356
def __delitem__(self, key):
4457
self.pop(self.elems.index(key))
4558

46-
def intersection(self, other):
59+
def __iter__(self) -> Iterator:
60+
for elem in self.elems:
61+
yield elem
62+
63+
def intersection(self, other: Iterable[T]):
4764
return IdentitySet(self._elems.intersection(other))
4865

49-
def union(self, other):
50-
return IdentitySet(self.elems + [x for x in other])
66+
def union(self, other: Iterable[T]):
67+
return IdentitySet(self.elems + list(other))
5168

52-
def pop(self, i):
69+
def pop(self, i: int) -> T:
5370
result = self.elems.pop(i)
5471
self._elems.remove(result)
5572
return result
5673

57-
def update(self, elems):
74+
def update(self, elems: Iterable[T]):
5875
self.elems.extend(x for x in elems if x not in self._elems)
59-
self._elems.update(x for x in elems)
76+
self._elems.update(elems)

0 commit comments

Comments
 (0)