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