xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/_collections_abc.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker# Copyright 2007 Google, Inc. All Rights Reserved.
2*cda5da8dSAndroid Build Coastguard Worker# Licensed to PSF under a Contributor Agreement.
3*cda5da8dSAndroid Build Coastguard Worker
4*cda5da8dSAndroid Build Coastguard Worker"""Abstract Base Classes (ABCs) for collections, according to PEP 3119.
5*cda5da8dSAndroid Build Coastguard Worker
6*cda5da8dSAndroid Build Coastguard WorkerUnit tests are in test_collections.
7*cda5da8dSAndroid Build Coastguard Worker"""
8*cda5da8dSAndroid Build Coastguard Worker
9*cda5da8dSAndroid Build Coastguard Workerfrom abc import ABCMeta, abstractmethod
10*cda5da8dSAndroid Build Coastguard Workerimport sys
11*cda5da8dSAndroid Build Coastguard Worker
12*cda5da8dSAndroid Build Coastguard WorkerGenericAlias = type(list[int])
13*cda5da8dSAndroid Build Coastguard WorkerEllipsisType = type(...)
14*cda5da8dSAndroid Build Coastguard Workerdef _f(): pass
15*cda5da8dSAndroid Build Coastguard WorkerFunctionType = type(_f)
16*cda5da8dSAndroid Build Coastguard Workerdel _f
17*cda5da8dSAndroid Build Coastguard Worker
18*cda5da8dSAndroid Build Coastguard Worker__all__ = ["Awaitable", "Coroutine",
19*cda5da8dSAndroid Build Coastguard Worker           "AsyncIterable", "AsyncIterator", "AsyncGenerator",
20*cda5da8dSAndroid Build Coastguard Worker           "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
21*cda5da8dSAndroid Build Coastguard Worker           "Sized", "Container", "Callable", "Collection",
22*cda5da8dSAndroid Build Coastguard Worker           "Set", "MutableSet",
23*cda5da8dSAndroid Build Coastguard Worker           "Mapping", "MutableMapping",
24*cda5da8dSAndroid Build Coastguard Worker           "MappingView", "KeysView", "ItemsView", "ValuesView",
25*cda5da8dSAndroid Build Coastguard Worker           "Sequence", "MutableSequence",
26*cda5da8dSAndroid Build Coastguard Worker           "ByteString",
27*cda5da8dSAndroid Build Coastguard Worker           ]
28*cda5da8dSAndroid Build Coastguard Worker
29*cda5da8dSAndroid Build Coastguard Worker# This module has been renamed from collections.abc to _collections_abc to
30*cda5da8dSAndroid Build Coastguard Worker# speed up interpreter startup. Some of the types such as MutableMapping are
31*cda5da8dSAndroid Build Coastguard Worker# required early but collections module imports a lot of other modules.
32*cda5da8dSAndroid Build Coastguard Worker# See issue #19218
33*cda5da8dSAndroid Build Coastguard Worker__name__ = "collections.abc"
34*cda5da8dSAndroid Build Coastguard Worker
35*cda5da8dSAndroid Build Coastguard Worker# Private list of types that we want to register with the various ABCs
36*cda5da8dSAndroid Build Coastguard Worker# so that they will pass tests like:
37*cda5da8dSAndroid Build Coastguard Worker#       it = iter(somebytearray)
38*cda5da8dSAndroid Build Coastguard Worker#       assert isinstance(it, Iterable)
39*cda5da8dSAndroid Build Coastguard Worker# Note:  in other implementations, these types might not be distinct
40*cda5da8dSAndroid Build Coastguard Worker# and they may have their own implementation specific types that
41*cda5da8dSAndroid Build Coastguard Worker# are not included on this list.
42*cda5da8dSAndroid Build Coastguard Workerbytes_iterator = type(iter(b''))
43*cda5da8dSAndroid Build Coastguard Workerbytearray_iterator = type(iter(bytearray()))
44*cda5da8dSAndroid Build Coastguard Worker#callable_iterator = ???
45*cda5da8dSAndroid Build Coastguard Workerdict_keyiterator = type(iter({}.keys()))
46*cda5da8dSAndroid Build Coastguard Workerdict_valueiterator = type(iter({}.values()))
47*cda5da8dSAndroid Build Coastguard Workerdict_itemiterator = type(iter({}.items()))
48*cda5da8dSAndroid Build Coastguard Workerlist_iterator = type(iter([]))
49*cda5da8dSAndroid Build Coastguard Workerlist_reverseiterator = type(iter(reversed([])))
50*cda5da8dSAndroid Build Coastguard Workerrange_iterator = type(iter(range(0)))
51*cda5da8dSAndroid Build Coastguard Workerlongrange_iterator = type(iter(range(1 << 1000)))
52*cda5da8dSAndroid Build Coastguard Workerset_iterator = type(iter(set()))
53*cda5da8dSAndroid Build Coastguard Workerstr_iterator = type(iter(""))
54*cda5da8dSAndroid Build Coastguard Workertuple_iterator = type(iter(()))
55*cda5da8dSAndroid Build Coastguard Workerzip_iterator = type(iter(zip()))
56*cda5da8dSAndroid Build Coastguard Worker## views ##
57*cda5da8dSAndroid Build Coastguard Workerdict_keys = type({}.keys())
58*cda5da8dSAndroid Build Coastguard Workerdict_values = type({}.values())
59*cda5da8dSAndroid Build Coastguard Workerdict_items = type({}.items())
60*cda5da8dSAndroid Build Coastguard Worker## misc ##
61*cda5da8dSAndroid Build Coastguard Workermappingproxy = type(type.__dict__)
62*cda5da8dSAndroid Build Coastguard Workergenerator = type((lambda: (yield))())
63*cda5da8dSAndroid Build Coastguard Worker## coroutine ##
64*cda5da8dSAndroid Build Coastguard Workerasync def _coro(): pass
65*cda5da8dSAndroid Build Coastguard Worker_coro = _coro()
66*cda5da8dSAndroid Build Coastguard Workercoroutine = type(_coro)
67*cda5da8dSAndroid Build Coastguard Worker_coro.close()  # Prevent ResourceWarning
68*cda5da8dSAndroid Build Coastguard Workerdel _coro
69*cda5da8dSAndroid Build Coastguard Worker## asynchronous generator ##
70*cda5da8dSAndroid Build Coastguard Workerasync def _ag(): yield
71*cda5da8dSAndroid Build Coastguard Worker_ag = _ag()
72*cda5da8dSAndroid Build Coastguard Workerasync_generator = type(_ag)
73*cda5da8dSAndroid Build Coastguard Workerdel _ag
74*cda5da8dSAndroid Build Coastguard Worker
75*cda5da8dSAndroid Build Coastguard Worker
76*cda5da8dSAndroid Build Coastguard Worker### ONE-TRICK PONIES ###
77*cda5da8dSAndroid Build Coastguard Worker
78*cda5da8dSAndroid Build Coastguard Workerdef _check_methods(C, *methods):
79*cda5da8dSAndroid Build Coastguard Worker    mro = C.__mro__
80*cda5da8dSAndroid Build Coastguard Worker    for method in methods:
81*cda5da8dSAndroid Build Coastguard Worker        for B in mro:
82*cda5da8dSAndroid Build Coastguard Worker            if method in B.__dict__:
83*cda5da8dSAndroid Build Coastguard Worker                if B.__dict__[method] is None:
84*cda5da8dSAndroid Build Coastguard Worker                    return NotImplemented
85*cda5da8dSAndroid Build Coastguard Worker                break
86*cda5da8dSAndroid Build Coastguard Worker        else:
87*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
88*cda5da8dSAndroid Build Coastguard Worker    return True
89*cda5da8dSAndroid Build Coastguard Worker
90*cda5da8dSAndroid Build Coastguard Workerclass Hashable(metaclass=ABCMeta):
91*cda5da8dSAndroid Build Coastguard Worker
92*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
93*cda5da8dSAndroid Build Coastguard Worker
94*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
95*cda5da8dSAndroid Build Coastguard Worker    def __hash__(self):
96*cda5da8dSAndroid Build Coastguard Worker        return 0
97*cda5da8dSAndroid Build Coastguard Worker
98*cda5da8dSAndroid Build Coastguard Worker    @classmethod
99*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
100*cda5da8dSAndroid Build Coastguard Worker        if cls is Hashable:
101*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__hash__")
102*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
103*cda5da8dSAndroid Build Coastguard Worker
104*cda5da8dSAndroid Build Coastguard Worker
105*cda5da8dSAndroid Build Coastguard Workerclass Awaitable(metaclass=ABCMeta):
106*cda5da8dSAndroid Build Coastguard Worker
107*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
108*cda5da8dSAndroid Build Coastguard Worker
109*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
110*cda5da8dSAndroid Build Coastguard Worker    def __await__(self):
111*cda5da8dSAndroid Build Coastguard Worker        yield
112*cda5da8dSAndroid Build Coastguard Worker
113*cda5da8dSAndroid Build Coastguard Worker    @classmethod
114*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
115*cda5da8dSAndroid Build Coastguard Worker        if cls is Awaitable:
116*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__await__")
117*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
118*cda5da8dSAndroid Build Coastguard Worker
119*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(GenericAlias)
120*cda5da8dSAndroid Build Coastguard Worker
121*cda5da8dSAndroid Build Coastguard Worker
122*cda5da8dSAndroid Build Coastguard Workerclass Coroutine(Awaitable):
123*cda5da8dSAndroid Build Coastguard Worker
124*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
125*cda5da8dSAndroid Build Coastguard Worker
126*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
127*cda5da8dSAndroid Build Coastguard Worker    def send(self, value):
128*cda5da8dSAndroid Build Coastguard Worker        """Send a value into the coroutine.
129*cda5da8dSAndroid Build Coastguard Worker        Return next yielded value or raise StopIteration.
130*cda5da8dSAndroid Build Coastguard Worker        """
131*cda5da8dSAndroid Build Coastguard Worker        raise StopIteration
132*cda5da8dSAndroid Build Coastguard Worker
133*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
134*cda5da8dSAndroid Build Coastguard Worker    def throw(self, typ, val=None, tb=None):
135*cda5da8dSAndroid Build Coastguard Worker        """Raise an exception in the coroutine.
136*cda5da8dSAndroid Build Coastguard Worker        Return next yielded value or raise StopIteration.
137*cda5da8dSAndroid Build Coastguard Worker        """
138*cda5da8dSAndroid Build Coastguard Worker        if val is None:
139*cda5da8dSAndroid Build Coastguard Worker            if tb is None:
140*cda5da8dSAndroid Build Coastguard Worker                raise typ
141*cda5da8dSAndroid Build Coastguard Worker            val = typ()
142*cda5da8dSAndroid Build Coastguard Worker        if tb is not None:
143*cda5da8dSAndroid Build Coastguard Worker            val = val.with_traceback(tb)
144*cda5da8dSAndroid Build Coastguard Worker        raise val
145*cda5da8dSAndroid Build Coastguard Worker
146*cda5da8dSAndroid Build Coastguard Worker    def close(self):
147*cda5da8dSAndroid Build Coastguard Worker        """Raise GeneratorExit inside coroutine.
148*cda5da8dSAndroid Build Coastguard Worker        """
149*cda5da8dSAndroid Build Coastguard Worker        try:
150*cda5da8dSAndroid Build Coastguard Worker            self.throw(GeneratorExit)
151*cda5da8dSAndroid Build Coastguard Worker        except (GeneratorExit, StopIteration):
152*cda5da8dSAndroid Build Coastguard Worker            pass
153*cda5da8dSAndroid Build Coastguard Worker        else:
154*cda5da8dSAndroid Build Coastguard Worker            raise RuntimeError("coroutine ignored GeneratorExit")
155*cda5da8dSAndroid Build Coastguard Worker
156*cda5da8dSAndroid Build Coastguard Worker    @classmethod
157*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
158*cda5da8dSAndroid Build Coastguard Worker        if cls is Coroutine:
159*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, '__await__', 'send', 'throw', 'close')
160*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
161*cda5da8dSAndroid Build Coastguard Worker
162*cda5da8dSAndroid Build Coastguard Worker
163*cda5da8dSAndroid Build Coastguard WorkerCoroutine.register(coroutine)
164*cda5da8dSAndroid Build Coastguard Worker
165*cda5da8dSAndroid Build Coastguard Worker
166*cda5da8dSAndroid Build Coastguard Workerclass AsyncIterable(metaclass=ABCMeta):
167*cda5da8dSAndroid Build Coastguard Worker
168*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
169*cda5da8dSAndroid Build Coastguard Worker
170*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
171*cda5da8dSAndroid Build Coastguard Worker    def __aiter__(self):
172*cda5da8dSAndroid Build Coastguard Worker        return AsyncIterator()
173*cda5da8dSAndroid Build Coastguard Worker
174*cda5da8dSAndroid Build Coastguard Worker    @classmethod
175*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
176*cda5da8dSAndroid Build Coastguard Worker        if cls is AsyncIterable:
177*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__aiter__")
178*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
179*cda5da8dSAndroid Build Coastguard Worker
180*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(GenericAlias)
181*cda5da8dSAndroid Build Coastguard Worker
182*cda5da8dSAndroid Build Coastguard Worker
183*cda5da8dSAndroid Build Coastguard Workerclass AsyncIterator(AsyncIterable):
184*cda5da8dSAndroid Build Coastguard Worker
185*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
186*cda5da8dSAndroid Build Coastguard Worker
187*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
188*cda5da8dSAndroid Build Coastguard Worker    async def __anext__(self):
189*cda5da8dSAndroid Build Coastguard Worker        """Return the next item or raise StopAsyncIteration when exhausted."""
190*cda5da8dSAndroid Build Coastguard Worker        raise StopAsyncIteration
191*cda5da8dSAndroid Build Coastguard Worker
192*cda5da8dSAndroid Build Coastguard Worker    def __aiter__(self):
193*cda5da8dSAndroid Build Coastguard Worker        return self
194*cda5da8dSAndroid Build Coastguard Worker
195*cda5da8dSAndroid Build Coastguard Worker    @classmethod
196*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
197*cda5da8dSAndroid Build Coastguard Worker        if cls is AsyncIterator:
198*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__anext__", "__aiter__")
199*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
200*cda5da8dSAndroid Build Coastguard Worker
201*cda5da8dSAndroid Build Coastguard Worker
202*cda5da8dSAndroid Build Coastguard Workerclass AsyncGenerator(AsyncIterator):
203*cda5da8dSAndroid Build Coastguard Worker
204*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
205*cda5da8dSAndroid Build Coastguard Worker
206*cda5da8dSAndroid Build Coastguard Worker    async def __anext__(self):
207*cda5da8dSAndroid Build Coastguard Worker        """Return the next item from the asynchronous generator.
208*cda5da8dSAndroid Build Coastguard Worker        When exhausted, raise StopAsyncIteration.
209*cda5da8dSAndroid Build Coastguard Worker        """
210*cda5da8dSAndroid Build Coastguard Worker        return await self.asend(None)
211*cda5da8dSAndroid Build Coastguard Worker
212*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
213*cda5da8dSAndroid Build Coastguard Worker    async def asend(self, value):
214*cda5da8dSAndroid Build Coastguard Worker        """Send a value into the asynchronous generator.
215*cda5da8dSAndroid Build Coastguard Worker        Return next yielded value or raise StopAsyncIteration.
216*cda5da8dSAndroid Build Coastguard Worker        """
217*cda5da8dSAndroid Build Coastguard Worker        raise StopAsyncIteration
218*cda5da8dSAndroid Build Coastguard Worker
219*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
220*cda5da8dSAndroid Build Coastguard Worker    async def athrow(self, typ, val=None, tb=None):
221*cda5da8dSAndroid Build Coastguard Worker        """Raise an exception in the asynchronous generator.
222*cda5da8dSAndroid Build Coastguard Worker        Return next yielded value or raise StopAsyncIteration.
223*cda5da8dSAndroid Build Coastguard Worker        """
224*cda5da8dSAndroid Build Coastguard Worker        if val is None:
225*cda5da8dSAndroid Build Coastguard Worker            if tb is None:
226*cda5da8dSAndroid Build Coastguard Worker                raise typ
227*cda5da8dSAndroid Build Coastguard Worker            val = typ()
228*cda5da8dSAndroid Build Coastguard Worker        if tb is not None:
229*cda5da8dSAndroid Build Coastguard Worker            val = val.with_traceback(tb)
230*cda5da8dSAndroid Build Coastguard Worker        raise val
231*cda5da8dSAndroid Build Coastguard Worker
232*cda5da8dSAndroid Build Coastguard Worker    async def aclose(self):
233*cda5da8dSAndroid Build Coastguard Worker        """Raise GeneratorExit inside coroutine.
234*cda5da8dSAndroid Build Coastguard Worker        """
235*cda5da8dSAndroid Build Coastguard Worker        try:
236*cda5da8dSAndroid Build Coastguard Worker            await self.athrow(GeneratorExit)
237*cda5da8dSAndroid Build Coastguard Worker        except (GeneratorExit, StopAsyncIteration):
238*cda5da8dSAndroid Build Coastguard Worker            pass
239*cda5da8dSAndroid Build Coastguard Worker        else:
240*cda5da8dSAndroid Build Coastguard Worker            raise RuntimeError("asynchronous generator ignored GeneratorExit")
241*cda5da8dSAndroid Build Coastguard Worker
242*cda5da8dSAndroid Build Coastguard Worker    @classmethod
243*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
244*cda5da8dSAndroid Build Coastguard Worker        if cls is AsyncGenerator:
245*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, '__aiter__', '__anext__',
246*cda5da8dSAndroid Build Coastguard Worker                                  'asend', 'athrow', 'aclose')
247*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
248*cda5da8dSAndroid Build Coastguard Worker
249*cda5da8dSAndroid Build Coastguard Worker
250*cda5da8dSAndroid Build Coastguard WorkerAsyncGenerator.register(async_generator)
251*cda5da8dSAndroid Build Coastguard Worker
252*cda5da8dSAndroid Build Coastguard Worker
253*cda5da8dSAndroid Build Coastguard Workerclass Iterable(metaclass=ABCMeta):
254*cda5da8dSAndroid Build Coastguard Worker
255*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
256*cda5da8dSAndroid Build Coastguard Worker
257*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
258*cda5da8dSAndroid Build Coastguard Worker    def __iter__(self):
259*cda5da8dSAndroid Build Coastguard Worker        while False:
260*cda5da8dSAndroid Build Coastguard Worker            yield None
261*cda5da8dSAndroid Build Coastguard Worker
262*cda5da8dSAndroid Build Coastguard Worker    @classmethod
263*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
264*cda5da8dSAndroid Build Coastguard Worker        if cls is Iterable:
265*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__iter__")
266*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
267*cda5da8dSAndroid Build Coastguard Worker
268*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(GenericAlias)
269*cda5da8dSAndroid Build Coastguard Worker
270*cda5da8dSAndroid Build Coastguard Worker
271*cda5da8dSAndroid Build Coastguard Workerclass Iterator(Iterable):
272*cda5da8dSAndroid Build Coastguard Worker
273*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
274*cda5da8dSAndroid Build Coastguard Worker
275*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
276*cda5da8dSAndroid Build Coastguard Worker    def __next__(self):
277*cda5da8dSAndroid Build Coastguard Worker        'Return the next item from the iterator. When exhausted, raise StopIteration'
278*cda5da8dSAndroid Build Coastguard Worker        raise StopIteration
279*cda5da8dSAndroid Build Coastguard Worker
280*cda5da8dSAndroid Build Coastguard Worker    def __iter__(self):
281*cda5da8dSAndroid Build Coastguard Worker        return self
282*cda5da8dSAndroid Build Coastguard Worker
283*cda5da8dSAndroid Build Coastguard Worker    @classmethod
284*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
285*cda5da8dSAndroid Build Coastguard Worker        if cls is Iterator:
286*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, '__iter__', '__next__')
287*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
288*cda5da8dSAndroid Build Coastguard Worker
289*cda5da8dSAndroid Build Coastguard Worker
290*cda5da8dSAndroid Build Coastguard WorkerIterator.register(bytes_iterator)
291*cda5da8dSAndroid Build Coastguard WorkerIterator.register(bytearray_iterator)
292*cda5da8dSAndroid Build Coastguard Worker#Iterator.register(callable_iterator)
293*cda5da8dSAndroid Build Coastguard WorkerIterator.register(dict_keyiterator)
294*cda5da8dSAndroid Build Coastguard WorkerIterator.register(dict_valueiterator)
295*cda5da8dSAndroid Build Coastguard WorkerIterator.register(dict_itemiterator)
296*cda5da8dSAndroid Build Coastguard WorkerIterator.register(list_iterator)
297*cda5da8dSAndroid Build Coastguard WorkerIterator.register(list_reverseiterator)
298*cda5da8dSAndroid Build Coastguard WorkerIterator.register(range_iterator)
299*cda5da8dSAndroid Build Coastguard WorkerIterator.register(longrange_iterator)
300*cda5da8dSAndroid Build Coastguard WorkerIterator.register(set_iterator)
301*cda5da8dSAndroid Build Coastguard WorkerIterator.register(str_iterator)
302*cda5da8dSAndroid Build Coastguard WorkerIterator.register(tuple_iterator)
303*cda5da8dSAndroid Build Coastguard WorkerIterator.register(zip_iterator)
304*cda5da8dSAndroid Build Coastguard Worker
305*cda5da8dSAndroid Build Coastguard Worker
306*cda5da8dSAndroid Build Coastguard Workerclass Reversible(Iterable):
307*cda5da8dSAndroid Build Coastguard Worker
308*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
309*cda5da8dSAndroid Build Coastguard Worker
310*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
311*cda5da8dSAndroid Build Coastguard Worker    def __reversed__(self):
312*cda5da8dSAndroid Build Coastguard Worker        while False:
313*cda5da8dSAndroid Build Coastguard Worker            yield None
314*cda5da8dSAndroid Build Coastguard Worker
315*cda5da8dSAndroid Build Coastguard Worker    @classmethod
316*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
317*cda5da8dSAndroid Build Coastguard Worker        if cls is Reversible:
318*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__reversed__", "__iter__")
319*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
320*cda5da8dSAndroid Build Coastguard Worker
321*cda5da8dSAndroid Build Coastguard Worker
322*cda5da8dSAndroid Build Coastguard Workerclass Generator(Iterator):
323*cda5da8dSAndroid Build Coastguard Worker
324*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
325*cda5da8dSAndroid Build Coastguard Worker
326*cda5da8dSAndroid Build Coastguard Worker    def __next__(self):
327*cda5da8dSAndroid Build Coastguard Worker        """Return the next item from the generator.
328*cda5da8dSAndroid Build Coastguard Worker        When exhausted, raise StopIteration.
329*cda5da8dSAndroid Build Coastguard Worker        """
330*cda5da8dSAndroid Build Coastguard Worker        return self.send(None)
331*cda5da8dSAndroid Build Coastguard Worker
332*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
333*cda5da8dSAndroid Build Coastguard Worker    def send(self, value):
334*cda5da8dSAndroid Build Coastguard Worker        """Send a value into the generator.
335*cda5da8dSAndroid Build Coastguard Worker        Return next yielded value or raise StopIteration.
336*cda5da8dSAndroid Build Coastguard Worker        """
337*cda5da8dSAndroid Build Coastguard Worker        raise StopIteration
338*cda5da8dSAndroid Build Coastguard Worker
339*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
340*cda5da8dSAndroid Build Coastguard Worker    def throw(self, typ, val=None, tb=None):
341*cda5da8dSAndroid Build Coastguard Worker        """Raise an exception in the generator.
342*cda5da8dSAndroid Build Coastguard Worker        Return next yielded value or raise StopIteration.
343*cda5da8dSAndroid Build Coastguard Worker        """
344*cda5da8dSAndroid Build Coastguard Worker        if val is None:
345*cda5da8dSAndroid Build Coastguard Worker            if tb is None:
346*cda5da8dSAndroid Build Coastguard Worker                raise typ
347*cda5da8dSAndroid Build Coastguard Worker            val = typ()
348*cda5da8dSAndroid Build Coastguard Worker        if tb is not None:
349*cda5da8dSAndroid Build Coastguard Worker            val = val.with_traceback(tb)
350*cda5da8dSAndroid Build Coastguard Worker        raise val
351*cda5da8dSAndroid Build Coastguard Worker
352*cda5da8dSAndroid Build Coastguard Worker    def close(self):
353*cda5da8dSAndroid Build Coastguard Worker        """Raise GeneratorExit inside generator.
354*cda5da8dSAndroid Build Coastguard Worker        """
355*cda5da8dSAndroid Build Coastguard Worker        try:
356*cda5da8dSAndroid Build Coastguard Worker            self.throw(GeneratorExit)
357*cda5da8dSAndroid Build Coastguard Worker        except (GeneratorExit, StopIteration):
358*cda5da8dSAndroid Build Coastguard Worker            pass
359*cda5da8dSAndroid Build Coastguard Worker        else:
360*cda5da8dSAndroid Build Coastguard Worker            raise RuntimeError("generator ignored GeneratorExit")
361*cda5da8dSAndroid Build Coastguard Worker
362*cda5da8dSAndroid Build Coastguard Worker    @classmethod
363*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
364*cda5da8dSAndroid Build Coastguard Worker        if cls is Generator:
365*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, '__iter__', '__next__',
366*cda5da8dSAndroid Build Coastguard Worker                                  'send', 'throw', 'close')
367*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
368*cda5da8dSAndroid Build Coastguard Worker
369*cda5da8dSAndroid Build Coastguard Worker
370*cda5da8dSAndroid Build Coastguard WorkerGenerator.register(generator)
371*cda5da8dSAndroid Build Coastguard Worker
372*cda5da8dSAndroid Build Coastguard Worker
373*cda5da8dSAndroid Build Coastguard Workerclass Sized(metaclass=ABCMeta):
374*cda5da8dSAndroid Build Coastguard Worker
375*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
376*cda5da8dSAndroid Build Coastguard Worker
377*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
378*cda5da8dSAndroid Build Coastguard Worker    def __len__(self):
379*cda5da8dSAndroid Build Coastguard Worker        return 0
380*cda5da8dSAndroid Build Coastguard Worker
381*cda5da8dSAndroid Build Coastguard Worker    @classmethod
382*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
383*cda5da8dSAndroid Build Coastguard Worker        if cls is Sized:
384*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__len__")
385*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
386*cda5da8dSAndroid Build Coastguard Worker
387*cda5da8dSAndroid Build Coastguard Worker
388*cda5da8dSAndroid Build Coastguard Workerclass Container(metaclass=ABCMeta):
389*cda5da8dSAndroid Build Coastguard Worker
390*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
391*cda5da8dSAndroid Build Coastguard Worker
392*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
393*cda5da8dSAndroid Build Coastguard Worker    def __contains__(self, x):
394*cda5da8dSAndroid Build Coastguard Worker        return False
395*cda5da8dSAndroid Build Coastguard Worker
396*cda5da8dSAndroid Build Coastguard Worker    @classmethod
397*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
398*cda5da8dSAndroid Build Coastguard Worker        if cls is Container:
399*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__contains__")
400*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
401*cda5da8dSAndroid Build Coastguard Worker
402*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(GenericAlias)
403*cda5da8dSAndroid Build Coastguard Worker
404*cda5da8dSAndroid Build Coastguard Worker
405*cda5da8dSAndroid Build Coastguard Workerclass Collection(Sized, Iterable, Container):
406*cda5da8dSAndroid Build Coastguard Worker
407*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
408*cda5da8dSAndroid Build Coastguard Worker
409*cda5da8dSAndroid Build Coastguard Worker    @classmethod
410*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
411*cda5da8dSAndroid Build Coastguard Worker        if cls is Collection:
412*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C,  "__len__", "__iter__", "__contains__")
413*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
414*cda5da8dSAndroid Build Coastguard Worker
415*cda5da8dSAndroid Build Coastguard Worker
416*cda5da8dSAndroid Build Coastguard Workerclass _CallableGenericAlias(GenericAlias):
417*cda5da8dSAndroid Build Coastguard Worker    """ Represent `Callable[argtypes, resulttype]`.
418*cda5da8dSAndroid Build Coastguard Worker
419*cda5da8dSAndroid Build Coastguard Worker    This sets ``__args__`` to a tuple containing the flattened ``argtypes``
420*cda5da8dSAndroid Build Coastguard Worker    followed by ``resulttype``.
421*cda5da8dSAndroid Build Coastguard Worker
422*cda5da8dSAndroid Build Coastguard Worker    Example: ``Callable[[int, str], float]`` sets ``__args__`` to
423*cda5da8dSAndroid Build Coastguard Worker    ``(int, str, float)``.
424*cda5da8dSAndroid Build Coastguard Worker    """
425*cda5da8dSAndroid Build Coastguard Worker
426*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
427*cda5da8dSAndroid Build Coastguard Worker
428*cda5da8dSAndroid Build Coastguard Worker    def __new__(cls, origin, args):
429*cda5da8dSAndroid Build Coastguard Worker        if not (isinstance(args, tuple) and len(args) == 2):
430*cda5da8dSAndroid Build Coastguard Worker            raise TypeError(
431*cda5da8dSAndroid Build Coastguard Worker                "Callable must be used as Callable[[arg, ...], result].")
432*cda5da8dSAndroid Build Coastguard Worker        t_args, t_result = args
433*cda5da8dSAndroid Build Coastguard Worker        if isinstance(t_args, (tuple, list)):
434*cda5da8dSAndroid Build Coastguard Worker            args = (*t_args, t_result)
435*cda5da8dSAndroid Build Coastguard Worker        elif not _is_param_expr(t_args):
436*cda5da8dSAndroid Build Coastguard Worker            raise TypeError(f"Expected a list of types, an ellipsis, "
437*cda5da8dSAndroid Build Coastguard Worker                            f"ParamSpec, or Concatenate. Got {t_args}")
438*cda5da8dSAndroid Build Coastguard Worker        return super().__new__(cls, origin, args)
439*cda5da8dSAndroid Build Coastguard Worker
440*cda5da8dSAndroid Build Coastguard Worker    def __repr__(self):
441*cda5da8dSAndroid Build Coastguard Worker        if len(self.__args__) == 2 and _is_param_expr(self.__args__[0]):
442*cda5da8dSAndroid Build Coastguard Worker            return super().__repr__()
443*cda5da8dSAndroid Build Coastguard Worker        return (f'collections.abc.Callable'
444*cda5da8dSAndroid Build Coastguard Worker                f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
445*cda5da8dSAndroid Build Coastguard Worker                f'{_type_repr(self.__args__[-1])}]')
446*cda5da8dSAndroid Build Coastguard Worker
447*cda5da8dSAndroid Build Coastguard Worker    def __reduce__(self):
448*cda5da8dSAndroid Build Coastguard Worker        args = self.__args__
449*cda5da8dSAndroid Build Coastguard Worker        if not (len(args) == 2 and _is_param_expr(args[0])):
450*cda5da8dSAndroid Build Coastguard Worker            args = list(args[:-1]), args[-1]
451*cda5da8dSAndroid Build Coastguard Worker        return _CallableGenericAlias, (Callable, args)
452*cda5da8dSAndroid Build Coastguard Worker
453*cda5da8dSAndroid Build Coastguard Worker    def __getitem__(self, item):
454*cda5da8dSAndroid Build Coastguard Worker        # Called during TypeVar substitution, returns the custom subclass
455*cda5da8dSAndroid Build Coastguard Worker        # rather than the default types.GenericAlias object.  Most of the
456*cda5da8dSAndroid Build Coastguard Worker        # code is copied from typing's _GenericAlias and the builtin
457*cda5da8dSAndroid Build Coastguard Worker        # types.GenericAlias.
458*cda5da8dSAndroid Build Coastguard Worker
459*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(item, tuple):
460*cda5da8dSAndroid Build Coastguard Worker            item = (item,)
461*cda5da8dSAndroid Build Coastguard Worker        # A special case in PEP 612 where if X = Callable[P, int],
462*cda5da8dSAndroid Build Coastguard Worker        # then X[int, str] == X[[int, str]].
463*cda5da8dSAndroid Build Coastguard Worker        if (len(self.__parameters__) == 1
464*cda5da8dSAndroid Build Coastguard Worker                and _is_param_expr(self.__parameters__[0])
465*cda5da8dSAndroid Build Coastguard Worker                and item and not _is_param_expr(item[0])):
466*cda5da8dSAndroid Build Coastguard Worker            item = (item,)
467*cda5da8dSAndroid Build Coastguard Worker
468*cda5da8dSAndroid Build Coastguard Worker        new_args = super().__getitem__(item).__args__
469*cda5da8dSAndroid Build Coastguard Worker
470*cda5da8dSAndroid Build Coastguard Worker        # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612
471*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(new_args[0], (tuple, list)):
472*cda5da8dSAndroid Build Coastguard Worker            t_result = new_args[-1]
473*cda5da8dSAndroid Build Coastguard Worker            t_args = new_args[:-1]
474*cda5da8dSAndroid Build Coastguard Worker            new_args = (t_args, t_result)
475*cda5da8dSAndroid Build Coastguard Worker        return _CallableGenericAlias(Callable, tuple(new_args))
476*cda5da8dSAndroid Build Coastguard Worker
477*cda5da8dSAndroid Build Coastguard Workerdef _is_param_expr(obj):
478*cda5da8dSAndroid Build Coastguard Worker    """Checks if obj matches either a list of types, ``...``, ``ParamSpec`` or
479*cda5da8dSAndroid Build Coastguard Worker    ``_ConcatenateGenericAlias`` from typing.py
480*cda5da8dSAndroid Build Coastguard Worker    """
481*cda5da8dSAndroid Build Coastguard Worker    if obj is Ellipsis:
482*cda5da8dSAndroid Build Coastguard Worker        return True
483*cda5da8dSAndroid Build Coastguard Worker    if isinstance(obj, list):
484*cda5da8dSAndroid Build Coastguard Worker        return True
485*cda5da8dSAndroid Build Coastguard Worker    obj = type(obj)
486*cda5da8dSAndroid Build Coastguard Worker    names = ('ParamSpec', '_ConcatenateGenericAlias')
487*cda5da8dSAndroid Build Coastguard Worker    return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names)
488*cda5da8dSAndroid Build Coastguard Worker
489*cda5da8dSAndroid Build Coastguard Workerdef _type_repr(obj):
490*cda5da8dSAndroid Build Coastguard Worker    """Return the repr() of an object, special-casing types (internal helper).
491*cda5da8dSAndroid Build Coastguard Worker
492*cda5da8dSAndroid Build Coastguard Worker    Copied from :mod:`typing` since collections.abc
493*cda5da8dSAndroid Build Coastguard Worker    shouldn't depend on that module.
494*cda5da8dSAndroid Build Coastguard Worker    """
495*cda5da8dSAndroid Build Coastguard Worker    if isinstance(obj, GenericAlias):
496*cda5da8dSAndroid Build Coastguard Worker        return repr(obj)
497*cda5da8dSAndroid Build Coastguard Worker    if isinstance(obj, type):
498*cda5da8dSAndroid Build Coastguard Worker        if obj.__module__ == 'builtins':
499*cda5da8dSAndroid Build Coastguard Worker            return obj.__qualname__
500*cda5da8dSAndroid Build Coastguard Worker        return f'{obj.__module__}.{obj.__qualname__}'
501*cda5da8dSAndroid Build Coastguard Worker    if obj is Ellipsis:
502*cda5da8dSAndroid Build Coastguard Worker        return '...'
503*cda5da8dSAndroid Build Coastguard Worker    if isinstance(obj, FunctionType):
504*cda5da8dSAndroid Build Coastguard Worker        return obj.__name__
505*cda5da8dSAndroid Build Coastguard Worker    return repr(obj)
506*cda5da8dSAndroid Build Coastguard Worker
507*cda5da8dSAndroid Build Coastguard Worker
508*cda5da8dSAndroid Build Coastguard Workerclass Callable(metaclass=ABCMeta):
509*cda5da8dSAndroid Build Coastguard Worker
510*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
511*cda5da8dSAndroid Build Coastguard Worker
512*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
513*cda5da8dSAndroid Build Coastguard Worker    def __call__(self, *args, **kwds):
514*cda5da8dSAndroid Build Coastguard Worker        return False
515*cda5da8dSAndroid Build Coastguard Worker
516*cda5da8dSAndroid Build Coastguard Worker    @classmethod
517*cda5da8dSAndroid Build Coastguard Worker    def __subclasshook__(cls, C):
518*cda5da8dSAndroid Build Coastguard Worker        if cls is Callable:
519*cda5da8dSAndroid Build Coastguard Worker            return _check_methods(C, "__call__")
520*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
521*cda5da8dSAndroid Build Coastguard Worker
522*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(_CallableGenericAlias)
523*cda5da8dSAndroid Build Coastguard Worker
524*cda5da8dSAndroid Build Coastguard Worker
525*cda5da8dSAndroid Build Coastguard Worker### SETS ###
526*cda5da8dSAndroid Build Coastguard Worker
527*cda5da8dSAndroid Build Coastguard Worker
528*cda5da8dSAndroid Build Coastguard Workerclass Set(Collection):
529*cda5da8dSAndroid Build Coastguard Worker    """A set is a finite, iterable container.
530*cda5da8dSAndroid Build Coastguard Worker
531*cda5da8dSAndroid Build Coastguard Worker    This class provides concrete generic implementations of all
532*cda5da8dSAndroid Build Coastguard Worker    methods except for __contains__, __iter__ and __len__.
533*cda5da8dSAndroid Build Coastguard Worker
534*cda5da8dSAndroid Build Coastguard Worker    To override the comparisons (presumably for speed, as the
535*cda5da8dSAndroid Build Coastguard Worker    semantics are fixed), redefine __le__ and __ge__,
536*cda5da8dSAndroid Build Coastguard Worker    then the other operations will automatically follow suit.
537*cda5da8dSAndroid Build Coastguard Worker    """
538*cda5da8dSAndroid Build Coastguard Worker
539*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
540*cda5da8dSAndroid Build Coastguard Worker
541*cda5da8dSAndroid Build Coastguard Worker    def __le__(self, other):
542*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
543*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
544*cda5da8dSAndroid Build Coastguard Worker        if len(self) > len(other):
545*cda5da8dSAndroid Build Coastguard Worker            return False
546*cda5da8dSAndroid Build Coastguard Worker        for elem in self:
547*cda5da8dSAndroid Build Coastguard Worker            if elem not in other:
548*cda5da8dSAndroid Build Coastguard Worker                return False
549*cda5da8dSAndroid Build Coastguard Worker        return True
550*cda5da8dSAndroid Build Coastguard Worker
551*cda5da8dSAndroid Build Coastguard Worker    def __lt__(self, other):
552*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
553*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
554*cda5da8dSAndroid Build Coastguard Worker        return len(self) < len(other) and self.__le__(other)
555*cda5da8dSAndroid Build Coastguard Worker
556*cda5da8dSAndroid Build Coastguard Worker    def __gt__(self, other):
557*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
558*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
559*cda5da8dSAndroid Build Coastguard Worker        return len(self) > len(other) and self.__ge__(other)
560*cda5da8dSAndroid Build Coastguard Worker
561*cda5da8dSAndroid Build Coastguard Worker    def __ge__(self, other):
562*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
563*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
564*cda5da8dSAndroid Build Coastguard Worker        if len(self) < len(other):
565*cda5da8dSAndroid Build Coastguard Worker            return False
566*cda5da8dSAndroid Build Coastguard Worker        for elem in other:
567*cda5da8dSAndroid Build Coastguard Worker            if elem not in self:
568*cda5da8dSAndroid Build Coastguard Worker                return False
569*cda5da8dSAndroid Build Coastguard Worker        return True
570*cda5da8dSAndroid Build Coastguard Worker
571*cda5da8dSAndroid Build Coastguard Worker    def __eq__(self, other):
572*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
573*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
574*cda5da8dSAndroid Build Coastguard Worker        return len(self) == len(other) and self.__le__(other)
575*cda5da8dSAndroid Build Coastguard Worker
576*cda5da8dSAndroid Build Coastguard Worker    @classmethod
577*cda5da8dSAndroid Build Coastguard Worker    def _from_iterable(cls, it):
578*cda5da8dSAndroid Build Coastguard Worker        '''Construct an instance of the class from any iterable input.
579*cda5da8dSAndroid Build Coastguard Worker
580*cda5da8dSAndroid Build Coastguard Worker        Must override this method if the class constructor signature
581*cda5da8dSAndroid Build Coastguard Worker        does not accept an iterable for an input.
582*cda5da8dSAndroid Build Coastguard Worker        '''
583*cda5da8dSAndroid Build Coastguard Worker        return cls(it)
584*cda5da8dSAndroid Build Coastguard Worker
585*cda5da8dSAndroid Build Coastguard Worker    def __and__(self, other):
586*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Iterable):
587*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
588*cda5da8dSAndroid Build Coastguard Worker        return self._from_iterable(value for value in other if value in self)
589*cda5da8dSAndroid Build Coastguard Worker
590*cda5da8dSAndroid Build Coastguard Worker    __rand__ = __and__
591*cda5da8dSAndroid Build Coastguard Worker
592*cda5da8dSAndroid Build Coastguard Worker    def isdisjoint(self, other):
593*cda5da8dSAndroid Build Coastguard Worker        'Return True if two sets have a null intersection.'
594*cda5da8dSAndroid Build Coastguard Worker        for value in other:
595*cda5da8dSAndroid Build Coastguard Worker            if value in self:
596*cda5da8dSAndroid Build Coastguard Worker                return False
597*cda5da8dSAndroid Build Coastguard Worker        return True
598*cda5da8dSAndroid Build Coastguard Worker
599*cda5da8dSAndroid Build Coastguard Worker    def __or__(self, other):
600*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Iterable):
601*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
602*cda5da8dSAndroid Build Coastguard Worker        chain = (e for s in (self, other) for e in s)
603*cda5da8dSAndroid Build Coastguard Worker        return self._from_iterable(chain)
604*cda5da8dSAndroid Build Coastguard Worker
605*cda5da8dSAndroid Build Coastguard Worker    __ror__ = __or__
606*cda5da8dSAndroid Build Coastguard Worker
607*cda5da8dSAndroid Build Coastguard Worker    def __sub__(self, other):
608*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
609*cda5da8dSAndroid Build Coastguard Worker            if not isinstance(other, Iterable):
610*cda5da8dSAndroid Build Coastguard Worker                return NotImplemented
611*cda5da8dSAndroid Build Coastguard Worker            other = self._from_iterable(other)
612*cda5da8dSAndroid Build Coastguard Worker        return self._from_iterable(value for value in self
613*cda5da8dSAndroid Build Coastguard Worker                                   if value not in other)
614*cda5da8dSAndroid Build Coastguard Worker
615*cda5da8dSAndroid Build Coastguard Worker    def __rsub__(self, other):
616*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
617*cda5da8dSAndroid Build Coastguard Worker            if not isinstance(other, Iterable):
618*cda5da8dSAndroid Build Coastguard Worker                return NotImplemented
619*cda5da8dSAndroid Build Coastguard Worker            other = self._from_iterable(other)
620*cda5da8dSAndroid Build Coastguard Worker        return self._from_iterable(value for value in other
621*cda5da8dSAndroid Build Coastguard Worker                                   if value not in self)
622*cda5da8dSAndroid Build Coastguard Worker
623*cda5da8dSAndroid Build Coastguard Worker    def __xor__(self, other):
624*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Set):
625*cda5da8dSAndroid Build Coastguard Worker            if not isinstance(other, Iterable):
626*cda5da8dSAndroid Build Coastguard Worker                return NotImplemented
627*cda5da8dSAndroid Build Coastguard Worker            other = self._from_iterable(other)
628*cda5da8dSAndroid Build Coastguard Worker        return (self - other) | (other - self)
629*cda5da8dSAndroid Build Coastguard Worker
630*cda5da8dSAndroid Build Coastguard Worker    __rxor__ = __xor__
631*cda5da8dSAndroid Build Coastguard Worker
632*cda5da8dSAndroid Build Coastguard Worker    def _hash(self):
633*cda5da8dSAndroid Build Coastguard Worker        """Compute the hash value of a set.
634*cda5da8dSAndroid Build Coastguard Worker
635*cda5da8dSAndroid Build Coastguard Worker        Note that we don't define __hash__: not all sets are hashable.
636*cda5da8dSAndroid Build Coastguard Worker        But if you define a hashable set type, its __hash__ should
637*cda5da8dSAndroid Build Coastguard Worker        call this function.
638*cda5da8dSAndroid Build Coastguard Worker
639*cda5da8dSAndroid Build Coastguard Worker        This must be compatible __eq__.
640*cda5da8dSAndroid Build Coastguard Worker
641*cda5da8dSAndroid Build Coastguard Worker        All sets ought to compare equal if they contain the same
642*cda5da8dSAndroid Build Coastguard Worker        elements, regardless of how they are implemented, and
643*cda5da8dSAndroid Build Coastguard Worker        regardless of the order of the elements; so there's not much
644*cda5da8dSAndroid Build Coastguard Worker        freedom for __eq__ or __hash__.  We match the algorithm used
645*cda5da8dSAndroid Build Coastguard Worker        by the built-in frozenset type.
646*cda5da8dSAndroid Build Coastguard Worker        """
647*cda5da8dSAndroid Build Coastguard Worker        MAX = sys.maxsize
648*cda5da8dSAndroid Build Coastguard Worker        MASK = 2 * MAX + 1
649*cda5da8dSAndroid Build Coastguard Worker        n = len(self)
650*cda5da8dSAndroid Build Coastguard Worker        h = 1927868237 * (n + 1)
651*cda5da8dSAndroid Build Coastguard Worker        h &= MASK
652*cda5da8dSAndroid Build Coastguard Worker        for x in self:
653*cda5da8dSAndroid Build Coastguard Worker            hx = hash(x)
654*cda5da8dSAndroid Build Coastguard Worker            h ^= (hx ^ (hx << 16) ^ 89869747)  * 3644798167
655*cda5da8dSAndroid Build Coastguard Worker            h &= MASK
656*cda5da8dSAndroid Build Coastguard Worker        h ^= (h >> 11) ^ (h >> 25)
657*cda5da8dSAndroid Build Coastguard Worker        h = h * 69069 + 907133923
658*cda5da8dSAndroid Build Coastguard Worker        h &= MASK
659*cda5da8dSAndroid Build Coastguard Worker        if h > MAX:
660*cda5da8dSAndroid Build Coastguard Worker            h -= MASK + 1
661*cda5da8dSAndroid Build Coastguard Worker        if h == -1:
662*cda5da8dSAndroid Build Coastguard Worker            h = 590923713
663*cda5da8dSAndroid Build Coastguard Worker        return h
664*cda5da8dSAndroid Build Coastguard Worker
665*cda5da8dSAndroid Build Coastguard Worker
666*cda5da8dSAndroid Build Coastguard WorkerSet.register(frozenset)
667*cda5da8dSAndroid Build Coastguard Worker
668*cda5da8dSAndroid Build Coastguard Worker
669*cda5da8dSAndroid Build Coastguard Workerclass MutableSet(Set):
670*cda5da8dSAndroid Build Coastguard Worker    """A mutable set is a finite, iterable container.
671*cda5da8dSAndroid Build Coastguard Worker
672*cda5da8dSAndroid Build Coastguard Worker    This class provides concrete generic implementations of all
673*cda5da8dSAndroid Build Coastguard Worker    methods except for __contains__, __iter__, __len__,
674*cda5da8dSAndroid Build Coastguard Worker    add(), and discard().
675*cda5da8dSAndroid Build Coastguard Worker
676*cda5da8dSAndroid Build Coastguard Worker    To override the comparisons (presumably for speed, as the
677*cda5da8dSAndroid Build Coastguard Worker    semantics are fixed), all you have to do is redefine __le__ and
678*cda5da8dSAndroid Build Coastguard Worker    then the other operations will automatically follow suit.
679*cda5da8dSAndroid Build Coastguard Worker    """
680*cda5da8dSAndroid Build Coastguard Worker
681*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
682*cda5da8dSAndroid Build Coastguard Worker
683*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
684*cda5da8dSAndroid Build Coastguard Worker    def add(self, value):
685*cda5da8dSAndroid Build Coastguard Worker        """Add an element."""
686*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
687*cda5da8dSAndroid Build Coastguard Worker
688*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
689*cda5da8dSAndroid Build Coastguard Worker    def discard(self, value):
690*cda5da8dSAndroid Build Coastguard Worker        """Remove an element.  Do not raise an exception if absent."""
691*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
692*cda5da8dSAndroid Build Coastguard Worker
693*cda5da8dSAndroid Build Coastguard Worker    def remove(self, value):
694*cda5da8dSAndroid Build Coastguard Worker        """Remove an element. If not a member, raise a KeyError."""
695*cda5da8dSAndroid Build Coastguard Worker        if value not in self:
696*cda5da8dSAndroid Build Coastguard Worker            raise KeyError(value)
697*cda5da8dSAndroid Build Coastguard Worker        self.discard(value)
698*cda5da8dSAndroid Build Coastguard Worker
699*cda5da8dSAndroid Build Coastguard Worker    def pop(self):
700*cda5da8dSAndroid Build Coastguard Worker        """Return the popped value.  Raise KeyError if empty."""
701*cda5da8dSAndroid Build Coastguard Worker        it = iter(self)
702*cda5da8dSAndroid Build Coastguard Worker        try:
703*cda5da8dSAndroid Build Coastguard Worker            value = next(it)
704*cda5da8dSAndroid Build Coastguard Worker        except StopIteration:
705*cda5da8dSAndroid Build Coastguard Worker            raise KeyError from None
706*cda5da8dSAndroid Build Coastguard Worker        self.discard(value)
707*cda5da8dSAndroid Build Coastguard Worker        return value
708*cda5da8dSAndroid Build Coastguard Worker
709*cda5da8dSAndroid Build Coastguard Worker    def clear(self):
710*cda5da8dSAndroid Build Coastguard Worker        """This is slow (creates N new iterators!) but effective."""
711*cda5da8dSAndroid Build Coastguard Worker        try:
712*cda5da8dSAndroid Build Coastguard Worker            while True:
713*cda5da8dSAndroid Build Coastguard Worker                self.pop()
714*cda5da8dSAndroid Build Coastguard Worker        except KeyError:
715*cda5da8dSAndroid Build Coastguard Worker            pass
716*cda5da8dSAndroid Build Coastguard Worker
717*cda5da8dSAndroid Build Coastguard Worker    def __ior__(self, it):
718*cda5da8dSAndroid Build Coastguard Worker        for value in it:
719*cda5da8dSAndroid Build Coastguard Worker            self.add(value)
720*cda5da8dSAndroid Build Coastguard Worker        return self
721*cda5da8dSAndroid Build Coastguard Worker
722*cda5da8dSAndroid Build Coastguard Worker    def __iand__(self, it):
723*cda5da8dSAndroid Build Coastguard Worker        for value in (self - it):
724*cda5da8dSAndroid Build Coastguard Worker            self.discard(value)
725*cda5da8dSAndroid Build Coastguard Worker        return self
726*cda5da8dSAndroid Build Coastguard Worker
727*cda5da8dSAndroid Build Coastguard Worker    def __ixor__(self, it):
728*cda5da8dSAndroid Build Coastguard Worker        if it is self:
729*cda5da8dSAndroid Build Coastguard Worker            self.clear()
730*cda5da8dSAndroid Build Coastguard Worker        else:
731*cda5da8dSAndroid Build Coastguard Worker            if not isinstance(it, Set):
732*cda5da8dSAndroid Build Coastguard Worker                it = self._from_iterable(it)
733*cda5da8dSAndroid Build Coastguard Worker            for value in it:
734*cda5da8dSAndroid Build Coastguard Worker                if value in self:
735*cda5da8dSAndroid Build Coastguard Worker                    self.discard(value)
736*cda5da8dSAndroid Build Coastguard Worker                else:
737*cda5da8dSAndroid Build Coastguard Worker                    self.add(value)
738*cda5da8dSAndroid Build Coastguard Worker        return self
739*cda5da8dSAndroid Build Coastguard Worker
740*cda5da8dSAndroid Build Coastguard Worker    def __isub__(self, it):
741*cda5da8dSAndroid Build Coastguard Worker        if it is self:
742*cda5da8dSAndroid Build Coastguard Worker            self.clear()
743*cda5da8dSAndroid Build Coastguard Worker        else:
744*cda5da8dSAndroid Build Coastguard Worker            for value in it:
745*cda5da8dSAndroid Build Coastguard Worker                self.discard(value)
746*cda5da8dSAndroid Build Coastguard Worker        return self
747*cda5da8dSAndroid Build Coastguard Worker
748*cda5da8dSAndroid Build Coastguard Worker
749*cda5da8dSAndroid Build Coastguard WorkerMutableSet.register(set)
750*cda5da8dSAndroid Build Coastguard Worker
751*cda5da8dSAndroid Build Coastguard Worker
752*cda5da8dSAndroid Build Coastguard Worker### MAPPINGS ###
753*cda5da8dSAndroid Build Coastguard Worker
754*cda5da8dSAndroid Build Coastguard Workerclass Mapping(Collection):
755*cda5da8dSAndroid Build Coastguard Worker    """A Mapping is a generic container for associating key/value
756*cda5da8dSAndroid Build Coastguard Worker    pairs.
757*cda5da8dSAndroid Build Coastguard Worker
758*cda5da8dSAndroid Build Coastguard Worker    This class provides concrete generic implementations of all
759*cda5da8dSAndroid Build Coastguard Worker    methods except for __getitem__, __iter__, and __len__.
760*cda5da8dSAndroid Build Coastguard Worker    """
761*cda5da8dSAndroid Build Coastguard Worker
762*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
763*cda5da8dSAndroid Build Coastguard Worker
764*cda5da8dSAndroid Build Coastguard Worker    # Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set.
765*cda5da8dSAndroid Build Coastguard Worker    __abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING
766*cda5da8dSAndroid Build Coastguard Worker
767*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
768*cda5da8dSAndroid Build Coastguard Worker    def __getitem__(self, key):
769*cda5da8dSAndroid Build Coastguard Worker        raise KeyError
770*cda5da8dSAndroid Build Coastguard Worker
771*cda5da8dSAndroid Build Coastguard Worker    def get(self, key, default=None):
772*cda5da8dSAndroid Build Coastguard Worker        'D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.'
773*cda5da8dSAndroid Build Coastguard Worker        try:
774*cda5da8dSAndroid Build Coastguard Worker            return self[key]
775*cda5da8dSAndroid Build Coastguard Worker        except KeyError:
776*cda5da8dSAndroid Build Coastguard Worker            return default
777*cda5da8dSAndroid Build Coastguard Worker
778*cda5da8dSAndroid Build Coastguard Worker    def __contains__(self, key):
779*cda5da8dSAndroid Build Coastguard Worker        try:
780*cda5da8dSAndroid Build Coastguard Worker            self[key]
781*cda5da8dSAndroid Build Coastguard Worker        except KeyError:
782*cda5da8dSAndroid Build Coastguard Worker            return False
783*cda5da8dSAndroid Build Coastguard Worker        else:
784*cda5da8dSAndroid Build Coastguard Worker            return True
785*cda5da8dSAndroid Build Coastguard Worker
786*cda5da8dSAndroid Build Coastguard Worker    def keys(self):
787*cda5da8dSAndroid Build Coastguard Worker        "D.keys() -> a set-like object providing a view on D's keys"
788*cda5da8dSAndroid Build Coastguard Worker        return KeysView(self)
789*cda5da8dSAndroid Build Coastguard Worker
790*cda5da8dSAndroid Build Coastguard Worker    def items(self):
791*cda5da8dSAndroid Build Coastguard Worker        "D.items() -> a set-like object providing a view on D's items"
792*cda5da8dSAndroid Build Coastguard Worker        return ItemsView(self)
793*cda5da8dSAndroid Build Coastguard Worker
794*cda5da8dSAndroid Build Coastguard Worker    def values(self):
795*cda5da8dSAndroid Build Coastguard Worker        "D.values() -> an object providing a view on D's values"
796*cda5da8dSAndroid Build Coastguard Worker        return ValuesView(self)
797*cda5da8dSAndroid Build Coastguard Worker
798*cda5da8dSAndroid Build Coastguard Worker    def __eq__(self, other):
799*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(other, Mapping):
800*cda5da8dSAndroid Build Coastguard Worker            return NotImplemented
801*cda5da8dSAndroid Build Coastguard Worker        return dict(self.items()) == dict(other.items())
802*cda5da8dSAndroid Build Coastguard Worker
803*cda5da8dSAndroid Build Coastguard Worker    __reversed__ = None
804*cda5da8dSAndroid Build Coastguard Worker
805*cda5da8dSAndroid Build Coastguard WorkerMapping.register(mappingproxy)
806*cda5da8dSAndroid Build Coastguard Worker
807*cda5da8dSAndroid Build Coastguard Worker
808*cda5da8dSAndroid Build Coastguard Workerclass MappingView(Sized):
809*cda5da8dSAndroid Build Coastguard Worker
810*cda5da8dSAndroid Build Coastguard Worker    __slots__ = '_mapping',
811*cda5da8dSAndroid Build Coastguard Worker
812*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, mapping):
813*cda5da8dSAndroid Build Coastguard Worker        self._mapping = mapping
814*cda5da8dSAndroid Build Coastguard Worker
815*cda5da8dSAndroid Build Coastguard Worker    def __len__(self):
816*cda5da8dSAndroid Build Coastguard Worker        return len(self._mapping)
817*cda5da8dSAndroid Build Coastguard Worker
818*cda5da8dSAndroid Build Coastguard Worker    def __repr__(self):
819*cda5da8dSAndroid Build Coastguard Worker        return '{0.__class__.__name__}({0._mapping!r})'.format(self)
820*cda5da8dSAndroid Build Coastguard Worker
821*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(GenericAlias)
822*cda5da8dSAndroid Build Coastguard Worker
823*cda5da8dSAndroid Build Coastguard Worker
824*cda5da8dSAndroid Build Coastguard Workerclass KeysView(MappingView, Set):
825*cda5da8dSAndroid Build Coastguard Worker
826*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
827*cda5da8dSAndroid Build Coastguard Worker
828*cda5da8dSAndroid Build Coastguard Worker    @classmethod
829*cda5da8dSAndroid Build Coastguard Worker    def _from_iterable(cls, it):
830*cda5da8dSAndroid Build Coastguard Worker        return set(it)
831*cda5da8dSAndroid Build Coastguard Worker
832*cda5da8dSAndroid Build Coastguard Worker    def __contains__(self, key):
833*cda5da8dSAndroid Build Coastguard Worker        return key in self._mapping
834*cda5da8dSAndroid Build Coastguard Worker
835*cda5da8dSAndroid Build Coastguard Worker    def __iter__(self):
836*cda5da8dSAndroid Build Coastguard Worker        yield from self._mapping
837*cda5da8dSAndroid Build Coastguard Worker
838*cda5da8dSAndroid Build Coastguard Worker
839*cda5da8dSAndroid Build Coastguard WorkerKeysView.register(dict_keys)
840*cda5da8dSAndroid Build Coastguard Worker
841*cda5da8dSAndroid Build Coastguard Worker
842*cda5da8dSAndroid Build Coastguard Workerclass ItemsView(MappingView, Set):
843*cda5da8dSAndroid Build Coastguard Worker
844*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
845*cda5da8dSAndroid Build Coastguard Worker
846*cda5da8dSAndroid Build Coastguard Worker    @classmethod
847*cda5da8dSAndroid Build Coastguard Worker    def _from_iterable(cls, it):
848*cda5da8dSAndroid Build Coastguard Worker        return set(it)
849*cda5da8dSAndroid Build Coastguard Worker
850*cda5da8dSAndroid Build Coastguard Worker    def __contains__(self, item):
851*cda5da8dSAndroid Build Coastguard Worker        key, value = item
852*cda5da8dSAndroid Build Coastguard Worker        try:
853*cda5da8dSAndroid Build Coastguard Worker            v = self._mapping[key]
854*cda5da8dSAndroid Build Coastguard Worker        except KeyError:
855*cda5da8dSAndroid Build Coastguard Worker            return False
856*cda5da8dSAndroid Build Coastguard Worker        else:
857*cda5da8dSAndroid Build Coastguard Worker            return v is value or v == value
858*cda5da8dSAndroid Build Coastguard Worker
859*cda5da8dSAndroid Build Coastguard Worker    def __iter__(self):
860*cda5da8dSAndroid Build Coastguard Worker        for key in self._mapping:
861*cda5da8dSAndroid Build Coastguard Worker            yield (key, self._mapping[key])
862*cda5da8dSAndroid Build Coastguard Worker
863*cda5da8dSAndroid Build Coastguard Worker
864*cda5da8dSAndroid Build Coastguard WorkerItemsView.register(dict_items)
865*cda5da8dSAndroid Build Coastguard Worker
866*cda5da8dSAndroid Build Coastguard Worker
867*cda5da8dSAndroid Build Coastguard Workerclass ValuesView(MappingView, Collection):
868*cda5da8dSAndroid Build Coastguard Worker
869*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
870*cda5da8dSAndroid Build Coastguard Worker
871*cda5da8dSAndroid Build Coastguard Worker    def __contains__(self, value):
872*cda5da8dSAndroid Build Coastguard Worker        for key in self._mapping:
873*cda5da8dSAndroid Build Coastguard Worker            v = self._mapping[key]
874*cda5da8dSAndroid Build Coastguard Worker            if v is value or v == value:
875*cda5da8dSAndroid Build Coastguard Worker                return True
876*cda5da8dSAndroid Build Coastguard Worker        return False
877*cda5da8dSAndroid Build Coastguard Worker
878*cda5da8dSAndroid Build Coastguard Worker    def __iter__(self):
879*cda5da8dSAndroid Build Coastguard Worker        for key in self._mapping:
880*cda5da8dSAndroid Build Coastguard Worker            yield self._mapping[key]
881*cda5da8dSAndroid Build Coastguard Worker
882*cda5da8dSAndroid Build Coastguard Worker
883*cda5da8dSAndroid Build Coastguard WorkerValuesView.register(dict_values)
884*cda5da8dSAndroid Build Coastguard Worker
885*cda5da8dSAndroid Build Coastguard Worker
886*cda5da8dSAndroid Build Coastguard Workerclass MutableMapping(Mapping):
887*cda5da8dSAndroid Build Coastguard Worker    """A MutableMapping is a generic container for associating
888*cda5da8dSAndroid Build Coastguard Worker    key/value pairs.
889*cda5da8dSAndroid Build Coastguard Worker
890*cda5da8dSAndroid Build Coastguard Worker    This class provides concrete generic implementations of all
891*cda5da8dSAndroid Build Coastguard Worker    methods except for __getitem__, __setitem__, __delitem__,
892*cda5da8dSAndroid Build Coastguard Worker    __iter__, and __len__.
893*cda5da8dSAndroid Build Coastguard Worker    """
894*cda5da8dSAndroid Build Coastguard Worker
895*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
896*cda5da8dSAndroid Build Coastguard Worker
897*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
898*cda5da8dSAndroid Build Coastguard Worker    def __setitem__(self, key, value):
899*cda5da8dSAndroid Build Coastguard Worker        raise KeyError
900*cda5da8dSAndroid Build Coastguard Worker
901*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
902*cda5da8dSAndroid Build Coastguard Worker    def __delitem__(self, key):
903*cda5da8dSAndroid Build Coastguard Worker        raise KeyError
904*cda5da8dSAndroid Build Coastguard Worker
905*cda5da8dSAndroid Build Coastguard Worker    __marker = object()
906*cda5da8dSAndroid Build Coastguard Worker
907*cda5da8dSAndroid Build Coastguard Worker    def pop(self, key, default=__marker):
908*cda5da8dSAndroid Build Coastguard Worker        '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
909*cda5da8dSAndroid Build Coastguard Worker          If key is not found, d is returned if given, otherwise KeyError is raised.
910*cda5da8dSAndroid Build Coastguard Worker        '''
911*cda5da8dSAndroid Build Coastguard Worker        try:
912*cda5da8dSAndroid Build Coastguard Worker            value = self[key]
913*cda5da8dSAndroid Build Coastguard Worker        except KeyError:
914*cda5da8dSAndroid Build Coastguard Worker            if default is self.__marker:
915*cda5da8dSAndroid Build Coastguard Worker                raise
916*cda5da8dSAndroid Build Coastguard Worker            return default
917*cda5da8dSAndroid Build Coastguard Worker        else:
918*cda5da8dSAndroid Build Coastguard Worker            del self[key]
919*cda5da8dSAndroid Build Coastguard Worker            return value
920*cda5da8dSAndroid Build Coastguard Worker
921*cda5da8dSAndroid Build Coastguard Worker    def popitem(self):
922*cda5da8dSAndroid Build Coastguard Worker        '''D.popitem() -> (k, v), remove and return some (key, value) pair
923*cda5da8dSAndroid Build Coastguard Worker           as a 2-tuple; but raise KeyError if D is empty.
924*cda5da8dSAndroid Build Coastguard Worker        '''
925*cda5da8dSAndroid Build Coastguard Worker        try:
926*cda5da8dSAndroid Build Coastguard Worker            key = next(iter(self))
927*cda5da8dSAndroid Build Coastguard Worker        except StopIteration:
928*cda5da8dSAndroid Build Coastguard Worker            raise KeyError from None
929*cda5da8dSAndroid Build Coastguard Worker        value = self[key]
930*cda5da8dSAndroid Build Coastguard Worker        del self[key]
931*cda5da8dSAndroid Build Coastguard Worker        return key, value
932*cda5da8dSAndroid Build Coastguard Worker
933*cda5da8dSAndroid Build Coastguard Worker    def clear(self):
934*cda5da8dSAndroid Build Coastguard Worker        'D.clear() -> None.  Remove all items from D.'
935*cda5da8dSAndroid Build Coastguard Worker        try:
936*cda5da8dSAndroid Build Coastguard Worker            while True:
937*cda5da8dSAndroid Build Coastguard Worker                self.popitem()
938*cda5da8dSAndroid Build Coastguard Worker        except KeyError:
939*cda5da8dSAndroid Build Coastguard Worker            pass
940*cda5da8dSAndroid Build Coastguard Worker
941*cda5da8dSAndroid Build Coastguard Worker    def update(self, other=(), /, **kwds):
942*cda5da8dSAndroid Build Coastguard Worker        ''' D.update([E, ]**F) -> None.  Update D from mapping/iterable E and F.
943*cda5da8dSAndroid Build Coastguard Worker            If E present and has a .keys() method, does:     for k in E: D[k] = E[k]
944*cda5da8dSAndroid Build Coastguard Worker            If E present and lacks .keys() method, does:     for (k, v) in E: D[k] = v
945*cda5da8dSAndroid Build Coastguard Worker            In either case, this is followed by: for k, v in F.items(): D[k] = v
946*cda5da8dSAndroid Build Coastguard Worker        '''
947*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, Mapping):
948*cda5da8dSAndroid Build Coastguard Worker            for key in other:
949*cda5da8dSAndroid Build Coastguard Worker                self[key] = other[key]
950*cda5da8dSAndroid Build Coastguard Worker        elif hasattr(other, "keys"):
951*cda5da8dSAndroid Build Coastguard Worker            for key in other.keys():
952*cda5da8dSAndroid Build Coastguard Worker                self[key] = other[key]
953*cda5da8dSAndroid Build Coastguard Worker        else:
954*cda5da8dSAndroid Build Coastguard Worker            for key, value in other:
955*cda5da8dSAndroid Build Coastguard Worker                self[key] = value
956*cda5da8dSAndroid Build Coastguard Worker        for key, value in kwds.items():
957*cda5da8dSAndroid Build Coastguard Worker            self[key] = value
958*cda5da8dSAndroid Build Coastguard Worker
959*cda5da8dSAndroid Build Coastguard Worker    def setdefault(self, key, default=None):
960*cda5da8dSAndroid Build Coastguard Worker        'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
961*cda5da8dSAndroid Build Coastguard Worker        try:
962*cda5da8dSAndroid Build Coastguard Worker            return self[key]
963*cda5da8dSAndroid Build Coastguard Worker        except KeyError:
964*cda5da8dSAndroid Build Coastguard Worker            self[key] = default
965*cda5da8dSAndroid Build Coastguard Worker        return default
966*cda5da8dSAndroid Build Coastguard Worker
967*cda5da8dSAndroid Build Coastguard Worker
968*cda5da8dSAndroid Build Coastguard WorkerMutableMapping.register(dict)
969*cda5da8dSAndroid Build Coastguard Worker
970*cda5da8dSAndroid Build Coastguard Worker
971*cda5da8dSAndroid Build Coastguard Worker### SEQUENCES ###
972*cda5da8dSAndroid Build Coastguard Worker
973*cda5da8dSAndroid Build Coastguard Workerclass Sequence(Reversible, Collection):
974*cda5da8dSAndroid Build Coastguard Worker    """All the operations on a read-only sequence.
975*cda5da8dSAndroid Build Coastguard Worker
976*cda5da8dSAndroid Build Coastguard Worker    Concrete subclasses must override __new__ or __init__,
977*cda5da8dSAndroid Build Coastguard Worker    __getitem__, and __len__.
978*cda5da8dSAndroid Build Coastguard Worker    """
979*cda5da8dSAndroid Build Coastguard Worker
980*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
981*cda5da8dSAndroid Build Coastguard Worker
982*cda5da8dSAndroid Build Coastguard Worker    # Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set.
983*cda5da8dSAndroid Build Coastguard Worker    __abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE
984*cda5da8dSAndroid Build Coastguard Worker
985*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
986*cda5da8dSAndroid Build Coastguard Worker    def __getitem__(self, index):
987*cda5da8dSAndroid Build Coastguard Worker        raise IndexError
988*cda5da8dSAndroid Build Coastguard Worker
989*cda5da8dSAndroid Build Coastguard Worker    def __iter__(self):
990*cda5da8dSAndroid Build Coastguard Worker        i = 0
991*cda5da8dSAndroid Build Coastguard Worker        try:
992*cda5da8dSAndroid Build Coastguard Worker            while True:
993*cda5da8dSAndroid Build Coastguard Worker                v = self[i]
994*cda5da8dSAndroid Build Coastguard Worker                yield v
995*cda5da8dSAndroid Build Coastguard Worker                i += 1
996*cda5da8dSAndroid Build Coastguard Worker        except IndexError:
997*cda5da8dSAndroid Build Coastguard Worker            return
998*cda5da8dSAndroid Build Coastguard Worker
999*cda5da8dSAndroid Build Coastguard Worker    def __contains__(self, value):
1000*cda5da8dSAndroid Build Coastguard Worker        for v in self:
1001*cda5da8dSAndroid Build Coastguard Worker            if v is value or v == value:
1002*cda5da8dSAndroid Build Coastguard Worker                return True
1003*cda5da8dSAndroid Build Coastguard Worker        return False
1004*cda5da8dSAndroid Build Coastguard Worker
1005*cda5da8dSAndroid Build Coastguard Worker    def __reversed__(self):
1006*cda5da8dSAndroid Build Coastguard Worker        for i in reversed(range(len(self))):
1007*cda5da8dSAndroid Build Coastguard Worker            yield self[i]
1008*cda5da8dSAndroid Build Coastguard Worker
1009*cda5da8dSAndroid Build Coastguard Worker    def index(self, value, start=0, stop=None):
1010*cda5da8dSAndroid Build Coastguard Worker        '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
1011*cda5da8dSAndroid Build Coastguard Worker           Raises ValueError if the value is not present.
1012*cda5da8dSAndroid Build Coastguard Worker
1013*cda5da8dSAndroid Build Coastguard Worker           Supporting start and stop arguments is optional, but
1014*cda5da8dSAndroid Build Coastguard Worker           recommended.
1015*cda5da8dSAndroid Build Coastguard Worker        '''
1016*cda5da8dSAndroid Build Coastguard Worker        if start is not None and start < 0:
1017*cda5da8dSAndroid Build Coastguard Worker            start = max(len(self) + start, 0)
1018*cda5da8dSAndroid Build Coastguard Worker        if stop is not None and stop < 0:
1019*cda5da8dSAndroid Build Coastguard Worker            stop += len(self)
1020*cda5da8dSAndroid Build Coastguard Worker
1021*cda5da8dSAndroid Build Coastguard Worker        i = start
1022*cda5da8dSAndroid Build Coastguard Worker        while stop is None or i < stop:
1023*cda5da8dSAndroid Build Coastguard Worker            try:
1024*cda5da8dSAndroid Build Coastguard Worker                v = self[i]
1025*cda5da8dSAndroid Build Coastguard Worker            except IndexError:
1026*cda5da8dSAndroid Build Coastguard Worker                break
1027*cda5da8dSAndroid Build Coastguard Worker            if v is value or v == value:
1028*cda5da8dSAndroid Build Coastguard Worker                return i
1029*cda5da8dSAndroid Build Coastguard Worker            i += 1
1030*cda5da8dSAndroid Build Coastguard Worker        raise ValueError
1031*cda5da8dSAndroid Build Coastguard Worker
1032*cda5da8dSAndroid Build Coastguard Worker    def count(self, value):
1033*cda5da8dSAndroid Build Coastguard Worker        'S.count(value) -> integer -- return number of occurrences of value'
1034*cda5da8dSAndroid Build Coastguard Worker        return sum(1 for v in self if v is value or v == value)
1035*cda5da8dSAndroid Build Coastguard Worker
1036*cda5da8dSAndroid Build Coastguard WorkerSequence.register(tuple)
1037*cda5da8dSAndroid Build Coastguard WorkerSequence.register(str)
1038*cda5da8dSAndroid Build Coastguard WorkerSequence.register(range)
1039*cda5da8dSAndroid Build Coastguard WorkerSequence.register(memoryview)
1040*cda5da8dSAndroid Build Coastguard Worker
1041*cda5da8dSAndroid Build Coastguard Worker
1042*cda5da8dSAndroid Build Coastguard Workerclass ByteString(Sequence):
1043*cda5da8dSAndroid Build Coastguard Worker    """This unifies bytes and bytearray.
1044*cda5da8dSAndroid Build Coastguard Worker
1045*cda5da8dSAndroid Build Coastguard Worker    XXX Should add all their methods.
1046*cda5da8dSAndroid Build Coastguard Worker    """
1047*cda5da8dSAndroid Build Coastguard Worker
1048*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
1049*cda5da8dSAndroid Build Coastguard Worker
1050*cda5da8dSAndroid Build Coastguard WorkerByteString.register(bytes)
1051*cda5da8dSAndroid Build Coastguard WorkerByteString.register(bytearray)
1052*cda5da8dSAndroid Build Coastguard Worker
1053*cda5da8dSAndroid Build Coastguard Worker
1054*cda5da8dSAndroid Build Coastguard Workerclass MutableSequence(Sequence):
1055*cda5da8dSAndroid Build Coastguard Worker    """All the operations on a read-write sequence.
1056*cda5da8dSAndroid Build Coastguard Worker
1057*cda5da8dSAndroid Build Coastguard Worker    Concrete subclasses must provide __new__ or __init__,
1058*cda5da8dSAndroid Build Coastguard Worker    __getitem__, __setitem__, __delitem__, __len__, and insert().
1059*cda5da8dSAndroid Build Coastguard Worker    """
1060*cda5da8dSAndroid Build Coastguard Worker
1061*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
1062*cda5da8dSAndroid Build Coastguard Worker
1063*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
1064*cda5da8dSAndroid Build Coastguard Worker    def __setitem__(self, index, value):
1065*cda5da8dSAndroid Build Coastguard Worker        raise IndexError
1066*cda5da8dSAndroid Build Coastguard Worker
1067*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
1068*cda5da8dSAndroid Build Coastguard Worker    def __delitem__(self, index):
1069*cda5da8dSAndroid Build Coastguard Worker        raise IndexError
1070*cda5da8dSAndroid Build Coastguard Worker
1071*cda5da8dSAndroid Build Coastguard Worker    @abstractmethod
1072*cda5da8dSAndroid Build Coastguard Worker    def insert(self, index, value):
1073*cda5da8dSAndroid Build Coastguard Worker        'S.insert(index, value) -- insert value before index'
1074*cda5da8dSAndroid Build Coastguard Worker        raise IndexError
1075*cda5da8dSAndroid Build Coastguard Worker
1076*cda5da8dSAndroid Build Coastguard Worker    def append(self, value):
1077*cda5da8dSAndroid Build Coastguard Worker        'S.append(value) -- append value to the end of the sequence'
1078*cda5da8dSAndroid Build Coastguard Worker        self.insert(len(self), value)
1079*cda5da8dSAndroid Build Coastguard Worker
1080*cda5da8dSAndroid Build Coastguard Worker    def clear(self):
1081*cda5da8dSAndroid Build Coastguard Worker        'S.clear() -> None -- remove all items from S'
1082*cda5da8dSAndroid Build Coastguard Worker        try:
1083*cda5da8dSAndroid Build Coastguard Worker            while True:
1084*cda5da8dSAndroid Build Coastguard Worker                self.pop()
1085*cda5da8dSAndroid Build Coastguard Worker        except IndexError:
1086*cda5da8dSAndroid Build Coastguard Worker            pass
1087*cda5da8dSAndroid Build Coastguard Worker
1088*cda5da8dSAndroid Build Coastguard Worker    def reverse(self):
1089*cda5da8dSAndroid Build Coastguard Worker        'S.reverse() -- reverse *IN PLACE*'
1090*cda5da8dSAndroid Build Coastguard Worker        n = len(self)
1091*cda5da8dSAndroid Build Coastguard Worker        for i in range(n//2):
1092*cda5da8dSAndroid Build Coastguard Worker            self[i], self[n-i-1] = self[n-i-1], self[i]
1093*cda5da8dSAndroid Build Coastguard Worker
1094*cda5da8dSAndroid Build Coastguard Worker    def extend(self, values):
1095*cda5da8dSAndroid Build Coastguard Worker        'S.extend(iterable) -- extend sequence by appending elements from the iterable'
1096*cda5da8dSAndroid Build Coastguard Worker        if values is self:
1097*cda5da8dSAndroid Build Coastguard Worker            values = list(values)
1098*cda5da8dSAndroid Build Coastguard Worker        for v in values:
1099*cda5da8dSAndroid Build Coastguard Worker            self.append(v)
1100*cda5da8dSAndroid Build Coastguard Worker
1101*cda5da8dSAndroid Build Coastguard Worker    def pop(self, index=-1):
1102*cda5da8dSAndroid Build Coastguard Worker        '''S.pop([index]) -> item -- remove and return item at index (default last).
1103*cda5da8dSAndroid Build Coastguard Worker           Raise IndexError if list is empty or index is out of range.
1104*cda5da8dSAndroid Build Coastguard Worker        '''
1105*cda5da8dSAndroid Build Coastguard Worker        v = self[index]
1106*cda5da8dSAndroid Build Coastguard Worker        del self[index]
1107*cda5da8dSAndroid Build Coastguard Worker        return v
1108*cda5da8dSAndroid Build Coastguard Worker
1109*cda5da8dSAndroid Build Coastguard Worker    def remove(self, value):
1110*cda5da8dSAndroid Build Coastguard Worker        '''S.remove(value) -- remove first occurrence of value.
1111*cda5da8dSAndroid Build Coastguard Worker           Raise ValueError if the value is not present.
1112*cda5da8dSAndroid Build Coastguard Worker        '''
1113*cda5da8dSAndroid Build Coastguard Worker        del self[self.index(value)]
1114*cda5da8dSAndroid Build Coastguard Worker
1115*cda5da8dSAndroid Build Coastguard Worker    def __iadd__(self, values):
1116*cda5da8dSAndroid Build Coastguard Worker        self.extend(values)
1117*cda5da8dSAndroid Build Coastguard Worker        return self
1118*cda5da8dSAndroid Build Coastguard Worker
1119*cda5da8dSAndroid Build Coastguard Worker
1120*cda5da8dSAndroid Build Coastguard WorkerMutableSequence.register(list)
1121*cda5da8dSAndroid Build Coastguard WorkerMutableSequence.register(bytearray)  # Multiply inheriting, see ByteString
1122