17db96d56Sopenharmony_ci# Copyright 2007 Google, Inc. All Rights Reserved.
27db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement.
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci"""Abstract Base Classes (ABCs) for collections, according to PEP 3119.
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ciUnit tests are in test_collections.
77db96d56Sopenharmony_ci"""
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_cifrom abc import ABCMeta, abstractmethod
107db96d56Sopenharmony_ciimport sys
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ciGenericAlias = type(list[int])
137db96d56Sopenharmony_ciEllipsisType = type(...)
147db96d56Sopenharmony_cidef _f(): pass
157db96d56Sopenharmony_ciFunctionType = type(_f)
167db96d56Sopenharmony_cidel _f
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci__all__ = ["Awaitable", "Coroutine",
197db96d56Sopenharmony_ci           "AsyncIterable", "AsyncIterator", "AsyncGenerator",
207db96d56Sopenharmony_ci           "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
217db96d56Sopenharmony_ci           "Sized", "Container", "Callable", "Collection",
227db96d56Sopenharmony_ci           "Set", "MutableSet",
237db96d56Sopenharmony_ci           "Mapping", "MutableMapping",
247db96d56Sopenharmony_ci           "MappingView", "KeysView", "ItemsView", "ValuesView",
257db96d56Sopenharmony_ci           "Sequence", "MutableSequence",
267db96d56Sopenharmony_ci           "ByteString",
277db96d56Sopenharmony_ci           ]
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci# This module has been renamed from collections.abc to _collections_abc to
307db96d56Sopenharmony_ci# speed up interpreter startup. Some of the types such as MutableMapping are
317db96d56Sopenharmony_ci# required early but collections module imports a lot of other modules.
327db96d56Sopenharmony_ci# See issue #19218
337db96d56Sopenharmony_ci__name__ = "collections.abc"
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci# Private list of types that we want to register with the various ABCs
367db96d56Sopenharmony_ci# so that they will pass tests like:
377db96d56Sopenharmony_ci#       it = iter(somebytearray)
387db96d56Sopenharmony_ci#       assert isinstance(it, Iterable)
397db96d56Sopenharmony_ci# Note:  in other implementations, these types might not be distinct
407db96d56Sopenharmony_ci# and they may have their own implementation specific types that
417db96d56Sopenharmony_ci# are not included on this list.
427db96d56Sopenharmony_cibytes_iterator = type(iter(b''))
437db96d56Sopenharmony_cibytearray_iterator = type(iter(bytearray()))
447db96d56Sopenharmony_ci#callable_iterator = ???
457db96d56Sopenharmony_cidict_keyiterator = type(iter({}.keys()))
467db96d56Sopenharmony_cidict_valueiterator = type(iter({}.values()))
477db96d56Sopenharmony_cidict_itemiterator = type(iter({}.items()))
487db96d56Sopenharmony_cilist_iterator = type(iter([]))
497db96d56Sopenharmony_cilist_reverseiterator = type(iter(reversed([])))
507db96d56Sopenharmony_cirange_iterator = type(iter(range(0)))
517db96d56Sopenharmony_cilongrange_iterator = type(iter(range(1 << 1000)))
527db96d56Sopenharmony_ciset_iterator = type(iter(set()))
537db96d56Sopenharmony_cistr_iterator = type(iter(""))
547db96d56Sopenharmony_cituple_iterator = type(iter(()))
557db96d56Sopenharmony_cizip_iterator = type(iter(zip()))
567db96d56Sopenharmony_ci## views ##
577db96d56Sopenharmony_cidict_keys = type({}.keys())
587db96d56Sopenharmony_cidict_values = type({}.values())
597db96d56Sopenharmony_cidict_items = type({}.items())
607db96d56Sopenharmony_ci## misc ##
617db96d56Sopenharmony_cimappingproxy = type(type.__dict__)
627db96d56Sopenharmony_cigenerator = type((lambda: (yield))())
637db96d56Sopenharmony_ci## coroutine ##
647db96d56Sopenharmony_ciasync def _coro(): pass
657db96d56Sopenharmony_ci_coro = _coro()
667db96d56Sopenharmony_cicoroutine = type(_coro)
677db96d56Sopenharmony_ci_coro.close()  # Prevent ResourceWarning
687db96d56Sopenharmony_cidel _coro
697db96d56Sopenharmony_ci## asynchronous generator ##
707db96d56Sopenharmony_ciasync def _ag(): yield
717db96d56Sopenharmony_ci_ag = _ag()
727db96d56Sopenharmony_ciasync_generator = type(_ag)
737db96d56Sopenharmony_cidel _ag
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci### ONE-TRICK PONIES ###
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_cidef _check_methods(C, *methods):
797db96d56Sopenharmony_ci    mro = C.__mro__
807db96d56Sopenharmony_ci    for method in methods:
817db96d56Sopenharmony_ci        for B in mro:
827db96d56Sopenharmony_ci            if method in B.__dict__:
837db96d56Sopenharmony_ci                if B.__dict__[method] is None:
847db96d56Sopenharmony_ci                    return NotImplemented
857db96d56Sopenharmony_ci                break
867db96d56Sopenharmony_ci        else:
877db96d56Sopenharmony_ci            return NotImplemented
887db96d56Sopenharmony_ci    return True
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ciclass Hashable(metaclass=ABCMeta):
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci    __slots__ = ()
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci    @abstractmethod
957db96d56Sopenharmony_ci    def __hash__(self):
967db96d56Sopenharmony_ci        return 0
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci    @classmethod
997db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
1007db96d56Sopenharmony_ci        if cls is Hashable:
1017db96d56Sopenharmony_ci            return _check_methods(C, "__hash__")
1027db96d56Sopenharmony_ci        return NotImplemented
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ciclass Awaitable(metaclass=ABCMeta):
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci    __slots__ = ()
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci    @abstractmethod
1107db96d56Sopenharmony_ci    def __await__(self):
1117db96d56Sopenharmony_ci        yield
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci    @classmethod
1147db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
1157db96d56Sopenharmony_ci        if cls is Awaitable:
1167db96d56Sopenharmony_ci            return _check_methods(C, "__await__")
1177db96d56Sopenharmony_ci        return NotImplemented
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    __class_getitem__ = classmethod(GenericAlias)
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ciclass Coroutine(Awaitable):
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci    __slots__ = ()
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci    @abstractmethod
1277db96d56Sopenharmony_ci    def send(self, value):
1287db96d56Sopenharmony_ci        """Send a value into the coroutine.
1297db96d56Sopenharmony_ci        Return next yielded value or raise StopIteration.
1307db96d56Sopenharmony_ci        """
1317db96d56Sopenharmony_ci        raise StopIteration
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci    @abstractmethod
1347db96d56Sopenharmony_ci    def throw(self, typ, val=None, tb=None):
1357db96d56Sopenharmony_ci        """Raise an exception in the coroutine.
1367db96d56Sopenharmony_ci        Return next yielded value or raise StopIteration.
1377db96d56Sopenharmony_ci        """
1387db96d56Sopenharmony_ci        if val is None:
1397db96d56Sopenharmony_ci            if tb is None:
1407db96d56Sopenharmony_ci                raise typ
1417db96d56Sopenharmony_ci            val = typ()
1427db96d56Sopenharmony_ci        if tb is not None:
1437db96d56Sopenharmony_ci            val = val.with_traceback(tb)
1447db96d56Sopenharmony_ci        raise val
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci    def close(self):
1477db96d56Sopenharmony_ci        """Raise GeneratorExit inside coroutine.
1487db96d56Sopenharmony_ci        """
1497db96d56Sopenharmony_ci        try:
1507db96d56Sopenharmony_ci            self.throw(GeneratorExit)
1517db96d56Sopenharmony_ci        except (GeneratorExit, StopIteration):
1527db96d56Sopenharmony_ci            pass
1537db96d56Sopenharmony_ci        else:
1547db96d56Sopenharmony_ci            raise RuntimeError("coroutine ignored GeneratorExit")
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci    @classmethod
1577db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
1587db96d56Sopenharmony_ci        if cls is Coroutine:
1597db96d56Sopenharmony_ci            return _check_methods(C, '__await__', 'send', 'throw', 'close')
1607db96d56Sopenharmony_ci        return NotImplemented
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ciCoroutine.register(coroutine)
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ciclass AsyncIterable(metaclass=ABCMeta):
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci    __slots__ = ()
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci    @abstractmethod
1717db96d56Sopenharmony_ci    def __aiter__(self):
1727db96d56Sopenharmony_ci        return AsyncIterator()
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci    @classmethod
1757db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
1767db96d56Sopenharmony_ci        if cls is AsyncIterable:
1777db96d56Sopenharmony_ci            return _check_methods(C, "__aiter__")
1787db96d56Sopenharmony_ci        return NotImplemented
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci    __class_getitem__ = classmethod(GenericAlias)
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciclass AsyncIterator(AsyncIterable):
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    __slots__ = ()
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci    @abstractmethod
1887db96d56Sopenharmony_ci    async def __anext__(self):
1897db96d56Sopenharmony_ci        """Return the next item or raise StopAsyncIteration when exhausted."""
1907db96d56Sopenharmony_ci        raise StopAsyncIteration
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    def __aiter__(self):
1937db96d56Sopenharmony_ci        return self
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci    @classmethod
1967db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
1977db96d56Sopenharmony_ci        if cls is AsyncIterator:
1987db96d56Sopenharmony_ci            return _check_methods(C, "__anext__", "__aiter__")
1997db96d56Sopenharmony_ci        return NotImplemented
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ciclass AsyncGenerator(AsyncIterator):
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    __slots__ = ()
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci    async def __anext__(self):
2077db96d56Sopenharmony_ci        """Return the next item from the asynchronous generator.
2087db96d56Sopenharmony_ci        When exhausted, raise StopAsyncIteration.
2097db96d56Sopenharmony_ci        """
2107db96d56Sopenharmony_ci        return await self.asend(None)
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci    @abstractmethod
2137db96d56Sopenharmony_ci    async def asend(self, value):
2147db96d56Sopenharmony_ci        """Send a value into the asynchronous generator.
2157db96d56Sopenharmony_ci        Return next yielded value or raise StopAsyncIteration.
2167db96d56Sopenharmony_ci        """
2177db96d56Sopenharmony_ci        raise StopAsyncIteration
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci    @abstractmethod
2207db96d56Sopenharmony_ci    async def athrow(self, typ, val=None, tb=None):
2217db96d56Sopenharmony_ci        """Raise an exception in the asynchronous generator.
2227db96d56Sopenharmony_ci        Return next yielded value or raise StopAsyncIteration.
2237db96d56Sopenharmony_ci        """
2247db96d56Sopenharmony_ci        if val is None:
2257db96d56Sopenharmony_ci            if tb is None:
2267db96d56Sopenharmony_ci                raise typ
2277db96d56Sopenharmony_ci            val = typ()
2287db96d56Sopenharmony_ci        if tb is not None:
2297db96d56Sopenharmony_ci            val = val.with_traceback(tb)
2307db96d56Sopenharmony_ci        raise val
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci    async def aclose(self):
2337db96d56Sopenharmony_ci        """Raise GeneratorExit inside coroutine.
2347db96d56Sopenharmony_ci        """
2357db96d56Sopenharmony_ci        try:
2367db96d56Sopenharmony_ci            await self.athrow(GeneratorExit)
2377db96d56Sopenharmony_ci        except (GeneratorExit, StopAsyncIteration):
2387db96d56Sopenharmony_ci            pass
2397db96d56Sopenharmony_ci        else:
2407db96d56Sopenharmony_ci            raise RuntimeError("asynchronous generator ignored GeneratorExit")
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci    @classmethod
2437db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
2447db96d56Sopenharmony_ci        if cls is AsyncGenerator:
2457db96d56Sopenharmony_ci            return _check_methods(C, '__aiter__', '__anext__',
2467db96d56Sopenharmony_ci                                  'asend', 'athrow', 'aclose')
2477db96d56Sopenharmony_ci        return NotImplemented
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ciAsyncGenerator.register(async_generator)
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ciclass Iterable(metaclass=ABCMeta):
2547db96d56Sopenharmony_ci
2557db96d56Sopenharmony_ci    __slots__ = ()
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci    @abstractmethod
2587db96d56Sopenharmony_ci    def __iter__(self):
2597db96d56Sopenharmony_ci        while False:
2607db96d56Sopenharmony_ci            yield None
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci    @classmethod
2637db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
2647db96d56Sopenharmony_ci        if cls is Iterable:
2657db96d56Sopenharmony_ci            return _check_methods(C, "__iter__")
2667db96d56Sopenharmony_ci        return NotImplemented
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci    __class_getitem__ = classmethod(GenericAlias)
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ciclass Iterator(Iterable):
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci    __slots__ = ()
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci    @abstractmethod
2767db96d56Sopenharmony_ci    def __next__(self):
2777db96d56Sopenharmony_ci        'Return the next item from the iterator. When exhausted, raise StopIteration'
2787db96d56Sopenharmony_ci        raise StopIteration
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci    def __iter__(self):
2817db96d56Sopenharmony_ci        return self
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci    @classmethod
2847db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
2857db96d56Sopenharmony_ci        if cls is Iterator:
2867db96d56Sopenharmony_ci            return _check_methods(C, '__iter__', '__next__')
2877db96d56Sopenharmony_ci        return NotImplemented
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ciIterator.register(bytes_iterator)
2917db96d56Sopenharmony_ciIterator.register(bytearray_iterator)
2927db96d56Sopenharmony_ci#Iterator.register(callable_iterator)
2937db96d56Sopenharmony_ciIterator.register(dict_keyiterator)
2947db96d56Sopenharmony_ciIterator.register(dict_valueiterator)
2957db96d56Sopenharmony_ciIterator.register(dict_itemiterator)
2967db96d56Sopenharmony_ciIterator.register(list_iterator)
2977db96d56Sopenharmony_ciIterator.register(list_reverseiterator)
2987db96d56Sopenharmony_ciIterator.register(range_iterator)
2997db96d56Sopenharmony_ciIterator.register(longrange_iterator)
3007db96d56Sopenharmony_ciIterator.register(set_iterator)
3017db96d56Sopenharmony_ciIterator.register(str_iterator)
3027db96d56Sopenharmony_ciIterator.register(tuple_iterator)
3037db96d56Sopenharmony_ciIterator.register(zip_iterator)
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ciclass Reversible(Iterable):
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci    __slots__ = ()
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci    @abstractmethod
3117db96d56Sopenharmony_ci    def __reversed__(self):
3127db96d56Sopenharmony_ci        while False:
3137db96d56Sopenharmony_ci            yield None
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci    @classmethod
3167db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
3177db96d56Sopenharmony_ci        if cls is Reversible:
3187db96d56Sopenharmony_ci            return _check_methods(C, "__reversed__", "__iter__")
3197db96d56Sopenharmony_ci        return NotImplemented
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ciclass Generator(Iterator):
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci    __slots__ = ()
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci    def __next__(self):
3277db96d56Sopenharmony_ci        """Return the next item from the generator.
3287db96d56Sopenharmony_ci        When exhausted, raise StopIteration.
3297db96d56Sopenharmony_ci        """
3307db96d56Sopenharmony_ci        return self.send(None)
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci    @abstractmethod
3337db96d56Sopenharmony_ci    def send(self, value):
3347db96d56Sopenharmony_ci        """Send a value into the generator.
3357db96d56Sopenharmony_ci        Return next yielded value or raise StopIteration.
3367db96d56Sopenharmony_ci        """
3377db96d56Sopenharmony_ci        raise StopIteration
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci    @abstractmethod
3407db96d56Sopenharmony_ci    def throw(self, typ, val=None, tb=None):
3417db96d56Sopenharmony_ci        """Raise an exception in the generator.
3427db96d56Sopenharmony_ci        Return next yielded value or raise StopIteration.
3437db96d56Sopenharmony_ci        """
3447db96d56Sopenharmony_ci        if val is None:
3457db96d56Sopenharmony_ci            if tb is None:
3467db96d56Sopenharmony_ci                raise typ
3477db96d56Sopenharmony_ci            val = typ()
3487db96d56Sopenharmony_ci        if tb is not None:
3497db96d56Sopenharmony_ci            val = val.with_traceback(tb)
3507db96d56Sopenharmony_ci        raise val
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci    def close(self):
3537db96d56Sopenharmony_ci        """Raise GeneratorExit inside generator.
3547db96d56Sopenharmony_ci        """
3557db96d56Sopenharmony_ci        try:
3567db96d56Sopenharmony_ci            self.throw(GeneratorExit)
3577db96d56Sopenharmony_ci        except (GeneratorExit, StopIteration):
3587db96d56Sopenharmony_ci            pass
3597db96d56Sopenharmony_ci        else:
3607db96d56Sopenharmony_ci            raise RuntimeError("generator ignored GeneratorExit")
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci    @classmethod
3637db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
3647db96d56Sopenharmony_ci        if cls is Generator:
3657db96d56Sopenharmony_ci            return _check_methods(C, '__iter__', '__next__',
3667db96d56Sopenharmony_ci                                  'send', 'throw', 'close')
3677db96d56Sopenharmony_ci        return NotImplemented
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ciGenerator.register(generator)
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ciclass Sized(metaclass=ABCMeta):
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci    __slots__ = ()
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci    @abstractmethod
3787db96d56Sopenharmony_ci    def __len__(self):
3797db96d56Sopenharmony_ci        return 0
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci    @classmethod
3827db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
3837db96d56Sopenharmony_ci        if cls is Sized:
3847db96d56Sopenharmony_ci            return _check_methods(C, "__len__")
3857db96d56Sopenharmony_ci        return NotImplemented
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ciclass Container(metaclass=ABCMeta):
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci    __slots__ = ()
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci    @abstractmethod
3937db96d56Sopenharmony_ci    def __contains__(self, x):
3947db96d56Sopenharmony_ci        return False
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci    @classmethod
3977db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
3987db96d56Sopenharmony_ci        if cls is Container:
3997db96d56Sopenharmony_ci            return _check_methods(C, "__contains__")
4007db96d56Sopenharmony_ci        return NotImplemented
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci    __class_getitem__ = classmethod(GenericAlias)
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ciclass Collection(Sized, Iterable, Container):
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_ci    __slots__ = ()
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci    @classmethod
4107db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
4117db96d56Sopenharmony_ci        if cls is Collection:
4127db96d56Sopenharmony_ci            return _check_methods(C,  "__len__", "__iter__", "__contains__")
4137db96d56Sopenharmony_ci        return NotImplemented
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ciclass _CallableGenericAlias(GenericAlias):
4177db96d56Sopenharmony_ci    """ Represent `Callable[argtypes, resulttype]`.
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci    This sets ``__args__`` to a tuple containing the flattened ``argtypes``
4207db96d56Sopenharmony_ci    followed by ``resulttype``.
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci    Example: ``Callable[[int, str], float]`` sets ``__args__`` to
4237db96d56Sopenharmony_ci    ``(int, str, float)``.
4247db96d56Sopenharmony_ci    """
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci    __slots__ = ()
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci    def __new__(cls, origin, args):
4297db96d56Sopenharmony_ci        if not (isinstance(args, tuple) and len(args) == 2):
4307db96d56Sopenharmony_ci            raise TypeError(
4317db96d56Sopenharmony_ci                "Callable must be used as Callable[[arg, ...], result].")
4327db96d56Sopenharmony_ci        t_args, t_result = args
4337db96d56Sopenharmony_ci        if isinstance(t_args, (tuple, list)):
4347db96d56Sopenharmony_ci            args = (*t_args, t_result)
4357db96d56Sopenharmony_ci        elif not _is_param_expr(t_args):
4367db96d56Sopenharmony_ci            raise TypeError(f"Expected a list of types, an ellipsis, "
4377db96d56Sopenharmony_ci                            f"ParamSpec, or Concatenate. Got {t_args}")
4387db96d56Sopenharmony_ci        return super().__new__(cls, origin, args)
4397db96d56Sopenharmony_ci
4407db96d56Sopenharmony_ci    def __repr__(self):
4417db96d56Sopenharmony_ci        if len(self.__args__) == 2 and _is_param_expr(self.__args__[0]):
4427db96d56Sopenharmony_ci            return super().__repr__()
4437db96d56Sopenharmony_ci        return (f'collections.abc.Callable'
4447db96d56Sopenharmony_ci                f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
4457db96d56Sopenharmony_ci                f'{_type_repr(self.__args__[-1])}]')
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ci    def __reduce__(self):
4487db96d56Sopenharmony_ci        args = self.__args__
4497db96d56Sopenharmony_ci        if not (len(args) == 2 and _is_param_expr(args[0])):
4507db96d56Sopenharmony_ci            args = list(args[:-1]), args[-1]
4517db96d56Sopenharmony_ci        return _CallableGenericAlias, (Callable, args)
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci    def __getitem__(self, item):
4547db96d56Sopenharmony_ci        # Called during TypeVar substitution, returns the custom subclass
4557db96d56Sopenharmony_ci        # rather than the default types.GenericAlias object.  Most of the
4567db96d56Sopenharmony_ci        # code is copied from typing's _GenericAlias and the builtin
4577db96d56Sopenharmony_ci        # types.GenericAlias.
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci        if not isinstance(item, tuple):
4607db96d56Sopenharmony_ci            item = (item,)
4617db96d56Sopenharmony_ci        # A special case in PEP 612 where if X = Callable[P, int],
4627db96d56Sopenharmony_ci        # then X[int, str] == X[[int, str]].
4637db96d56Sopenharmony_ci        if (len(self.__parameters__) == 1
4647db96d56Sopenharmony_ci                and _is_param_expr(self.__parameters__[0])
4657db96d56Sopenharmony_ci                and item and not _is_param_expr(item[0])):
4667db96d56Sopenharmony_ci            item = (item,)
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci        new_args = super().__getitem__(item).__args__
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci        # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612
4717db96d56Sopenharmony_ci        if not isinstance(new_args[0], (tuple, list)):
4727db96d56Sopenharmony_ci            t_result = new_args[-1]
4737db96d56Sopenharmony_ci            t_args = new_args[:-1]
4747db96d56Sopenharmony_ci            new_args = (t_args, t_result)
4757db96d56Sopenharmony_ci        return _CallableGenericAlias(Callable, tuple(new_args))
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_cidef _is_param_expr(obj):
4787db96d56Sopenharmony_ci    """Checks if obj matches either a list of types, ``...``, ``ParamSpec`` or
4797db96d56Sopenharmony_ci    ``_ConcatenateGenericAlias`` from typing.py
4807db96d56Sopenharmony_ci    """
4817db96d56Sopenharmony_ci    if obj is Ellipsis:
4827db96d56Sopenharmony_ci        return True
4837db96d56Sopenharmony_ci    if isinstance(obj, list):
4847db96d56Sopenharmony_ci        return True
4857db96d56Sopenharmony_ci    obj = type(obj)
4867db96d56Sopenharmony_ci    names = ('ParamSpec', '_ConcatenateGenericAlias')
4877db96d56Sopenharmony_ci    return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names)
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_cidef _type_repr(obj):
4907db96d56Sopenharmony_ci    """Return the repr() of an object, special-casing types (internal helper).
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ci    Copied from :mod:`typing` since collections.abc
4937db96d56Sopenharmony_ci    shouldn't depend on that module.
4947db96d56Sopenharmony_ci    """
4957db96d56Sopenharmony_ci    if isinstance(obj, GenericAlias):
4967db96d56Sopenharmony_ci        return repr(obj)
4977db96d56Sopenharmony_ci    if isinstance(obj, type):
4987db96d56Sopenharmony_ci        if obj.__module__ == 'builtins':
4997db96d56Sopenharmony_ci            return obj.__qualname__
5007db96d56Sopenharmony_ci        return f'{obj.__module__}.{obj.__qualname__}'
5017db96d56Sopenharmony_ci    if obj is Ellipsis:
5027db96d56Sopenharmony_ci        return '...'
5037db96d56Sopenharmony_ci    if isinstance(obj, FunctionType):
5047db96d56Sopenharmony_ci        return obj.__name__
5057db96d56Sopenharmony_ci    return repr(obj)
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ciclass Callable(metaclass=ABCMeta):
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci    __slots__ = ()
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci    @abstractmethod
5137db96d56Sopenharmony_ci    def __call__(self, *args, **kwds):
5147db96d56Sopenharmony_ci        return False
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci    @classmethod
5177db96d56Sopenharmony_ci    def __subclasshook__(cls, C):
5187db96d56Sopenharmony_ci        if cls is Callable:
5197db96d56Sopenharmony_ci            return _check_methods(C, "__call__")
5207db96d56Sopenharmony_ci        return NotImplemented
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci    __class_getitem__ = classmethod(_CallableGenericAlias)
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci
5257db96d56Sopenharmony_ci### SETS ###
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ciclass Set(Collection):
5297db96d56Sopenharmony_ci    """A set is a finite, iterable container.
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci    This class provides concrete generic implementations of all
5327db96d56Sopenharmony_ci    methods except for __contains__, __iter__ and __len__.
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci    To override the comparisons (presumably for speed, as the
5357db96d56Sopenharmony_ci    semantics are fixed), redefine __le__ and __ge__,
5367db96d56Sopenharmony_ci    then the other operations will automatically follow suit.
5377db96d56Sopenharmony_ci    """
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci    __slots__ = ()
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci    def __le__(self, other):
5427db96d56Sopenharmony_ci        if not isinstance(other, Set):
5437db96d56Sopenharmony_ci            return NotImplemented
5447db96d56Sopenharmony_ci        if len(self) > len(other):
5457db96d56Sopenharmony_ci            return False
5467db96d56Sopenharmony_ci        for elem in self:
5477db96d56Sopenharmony_ci            if elem not in other:
5487db96d56Sopenharmony_ci                return False
5497db96d56Sopenharmony_ci        return True
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci    def __lt__(self, other):
5527db96d56Sopenharmony_ci        if not isinstance(other, Set):
5537db96d56Sopenharmony_ci            return NotImplemented
5547db96d56Sopenharmony_ci        return len(self) < len(other) and self.__le__(other)
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_ci    def __gt__(self, other):
5577db96d56Sopenharmony_ci        if not isinstance(other, Set):
5587db96d56Sopenharmony_ci            return NotImplemented
5597db96d56Sopenharmony_ci        return len(self) > len(other) and self.__ge__(other)
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci    def __ge__(self, other):
5627db96d56Sopenharmony_ci        if not isinstance(other, Set):
5637db96d56Sopenharmony_ci            return NotImplemented
5647db96d56Sopenharmony_ci        if len(self) < len(other):
5657db96d56Sopenharmony_ci            return False
5667db96d56Sopenharmony_ci        for elem in other:
5677db96d56Sopenharmony_ci            if elem not in self:
5687db96d56Sopenharmony_ci                return False
5697db96d56Sopenharmony_ci        return True
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci    def __eq__(self, other):
5727db96d56Sopenharmony_ci        if not isinstance(other, Set):
5737db96d56Sopenharmony_ci            return NotImplemented
5747db96d56Sopenharmony_ci        return len(self) == len(other) and self.__le__(other)
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci    @classmethod
5777db96d56Sopenharmony_ci    def _from_iterable(cls, it):
5787db96d56Sopenharmony_ci        '''Construct an instance of the class from any iterable input.
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci        Must override this method if the class constructor signature
5817db96d56Sopenharmony_ci        does not accept an iterable for an input.
5827db96d56Sopenharmony_ci        '''
5837db96d56Sopenharmony_ci        return cls(it)
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci    def __and__(self, other):
5867db96d56Sopenharmony_ci        if not isinstance(other, Iterable):
5877db96d56Sopenharmony_ci            return NotImplemented
5887db96d56Sopenharmony_ci        return self._from_iterable(value for value in other if value in self)
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ci    __rand__ = __and__
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_ci    def isdisjoint(self, other):
5937db96d56Sopenharmony_ci        'Return True if two sets have a null intersection.'
5947db96d56Sopenharmony_ci        for value in other:
5957db96d56Sopenharmony_ci            if value in self:
5967db96d56Sopenharmony_ci                return False
5977db96d56Sopenharmony_ci        return True
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci    def __or__(self, other):
6007db96d56Sopenharmony_ci        if not isinstance(other, Iterable):
6017db96d56Sopenharmony_ci            return NotImplemented
6027db96d56Sopenharmony_ci        chain = (e for s in (self, other) for e in s)
6037db96d56Sopenharmony_ci        return self._from_iterable(chain)
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci    __ror__ = __or__
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci    def __sub__(self, other):
6087db96d56Sopenharmony_ci        if not isinstance(other, Set):
6097db96d56Sopenharmony_ci            if not isinstance(other, Iterable):
6107db96d56Sopenharmony_ci                return NotImplemented
6117db96d56Sopenharmony_ci            other = self._from_iterable(other)
6127db96d56Sopenharmony_ci        return self._from_iterable(value for value in self
6137db96d56Sopenharmony_ci                                   if value not in other)
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ci    def __rsub__(self, other):
6167db96d56Sopenharmony_ci        if not isinstance(other, Set):
6177db96d56Sopenharmony_ci            if not isinstance(other, Iterable):
6187db96d56Sopenharmony_ci                return NotImplemented
6197db96d56Sopenharmony_ci            other = self._from_iterable(other)
6207db96d56Sopenharmony_ci        return self._from_iterable(value for value in other
6217db96d56Sopenharmony_ci                                   if value not in self)
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci    def __xor__(self, other):
6247db96d56Sopenharmony_ci        if not isinstance(other, Set):
6257db96d56Sopenharmony_ci            if not isinstance(other, Iterable):
6267db96d56Sopenharmony_ci                return NotImplemented
6277db96d56Sopenharmony_ci            other = self._from_iterable(other)
6287db96d56Sopenharmony_ci        return (self - other) | (other - self)
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci    __rxor__ = __xor__
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci    def _hash(self):
6337db96d56Sopenharmony_ci        """Compute the hash value of a set.
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci        Note that we don't define __hash__: not all sets are hashable.
6367db96d56Sopenharmony_ci        But if you define a hashable set type, its __hash__ should
6377db96d56Sopenharmony_ci        call this function.
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_ci        This must be compatible __eq__.
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci        All sets ought to compare equal if they contain the same
6427db96d56Sopenharmony_ci        elements, regardless of how they are implemented, and
6437db96d56Sopenharmony_ci        regardless of the order of the elements; so there's not much
6447db96d56Sopenharmony_ci        freedom for __eq__ or __hash__.  We match the algorithm used
6457db96d56Sopenharmony_ci        by the built-in frozenset type.
6467db96d56Sopenharmony_ci        """
6477db96d56Sopenharmony_ci        MAX = sys.maxsize
6487db96d56Sopenharmony_ci        MASK = 2 * MAX + 1
6497db96d56Sopenharmony_ci        n = len(self)
6507db96d56Sopenharmony_ci        h = 1927868237 * (n + 1)
6517db96d56Sopenharmony_ci        h &= MASK
6527db96d56Sopenharmony_ci        for x in self:
6537db96d56Sopenharmony_ci            hx = hash(x)
6547db96d56Sopenharmony_ci            h ^= (hx ^ (hx << 16) ^ 89869747)  * 3644798167
6557db96d56Sopenharmony_ci            h &= MASK
6567db96d56Sopenharmony_ci        h ^= (h >> 11) ^ (h >> 25)
6577db96d56Sopenharmony_ci        h = h * 69069 + 907133923
6587db96d56Sopenharmony_ci        h &= MASK
6597db96d56Sopenharmony_ci        if h > MAX:
6607db96d56Sopenharmony_ci            h -= MASK + 1
6617db96d56Sopenharmony_ci        if h == -1:
6627db96d56Sopenharmony_ci            h = 590923713
6637db96d56Sopenharmony_ci        return h
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ciSet.register(frozenset)
6677db96d56Sopenharmony_ci
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ciclass MutableSet(Set):
6707db96d56Sopenharmony_ci    """A mutable set is a finite, iterable container.
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci    This class provides concrete generic implementations of all
6737db96d56Sopenharmony_ci    methods except for __contains__, __iter__, __len__,
6747db96d56Sopenharmony_ci    add(), and discard().
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci    To override the comparisons (presumably for speed, as the
6777db96d56Sopenharmony_ci    semantics are fixed), all you have to do is redefine __le__ and
6787db96d56Sopenharmony_ci    then the other operations will automatically follow suit.
6797db96d56Sopenharmony_ci    """
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ci    __slots__ = ()
6827db96d56Sopenharmony_ci
6837db96d56Sopenharmony_ci    @abstractmethod
6847db96d56Sopenharmony_ci    def add(self, value):
6857db96d56Sopenharmony_ci        """Add an element."""
6867db96d56Sopenharmony_ci        raise NotImplementedError
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci    @abstractmethod
6897db96d56Sopenharmony_ci    def discard(self, value):
6907db96d56Sopenharmony_ci        """Remove an element.  Do not raise an exception if absent."""
6917db96d56Sopenharmony_ci        raise NotImplementedError
6927db96d56Sopenharmony_ci
6937db96d56Sopenharmony_ci    def remove(self, value):
6947db96d56Sopenharmony_ci        """Remove an element. If not a member, raise a KeyError."""
6957db96d56Sopenharmony_ci        if value not in self:
6967db96d56Sopenharmony_ci            raise KeyError(value)
6977db96d56Sopenharmony_ci        self.discard(value)
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci    def pop(self):
7007db96d56Sopenharmony_ci        """Return the popped value.  Raise KeyError if empty."""
7017db96d56Sopenharmony_ci        it = iter(self)
7027db96d56Sopenharmony_ci        try:
7037db96d56Sopenharmony_ci            value = next(it)
7047db96d56Sopenharmony_ci        except StopIteration:
7057db96d56Sopenharmony_ci            raise KeyError from None
7067db96d56Sopenharmony_ci        self.discard(value)
7077db96d56Sopenharmony_ci        return value
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_ci    def clear(self):
7107db96d56Sopenharmony_ci        """This is slow (creates N new iterators!) but effective."""
7117db96d56Sopenharmony_ci        try:
7127db96d56Sopenharmony_ci            while True:
7137db96d56Sopenharmony_ci                self.pop()
7147db96d56Sopenharmony_ci        except KeyError:
7157db96d56Sopenharmony_ci            pass
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci    def __ior__(self, it):
7187db96d56Sopenharmony_ci        for value in it:
7197db96d56Sopenharmony_ci            self.add(value)
7207db96d56Sopenharmony_ci        return self
7217db96d56Sopenharmony_ci
7227db96d56Sopenharmony_ci    def __iand__(self, it):
7237db96d56Sopenharmony_ci        for value in (self - it):
7247db96d56Sopenharmony_ci            self.discard(value)
7257db96d56Sopenharmony_ci        return self
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci    def __ixor__(self, it):
7287db96d56Sopenharmony_ci        if it is self:
7297db96d56Sopenharmony_ci            self.clear()
7307db96d56Sopenharmony_ci        else:
7317db96d56Sopenharmony_ci            if not isinstance(it, Set):
7327db96d56Sopenharmony_ci                it = self._from_iterable(it)
7337db96d56Sopenharmony_ci            for value in it:
7347db96d56Sopenharmony_ci                if value in self:
7357db96d56Sopenharmony_ci                    self.discard(value)
7367db96d56Sopenharmony_ci                else:
7377db96d56Sopenharmony_ci                    self.add(value)
7387db96d56Sopenharmony_ci        return self
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_ci    def __isub__(self, it):
7417db96d56Sopenharmony_ci        if it is self:
7427db96d56Sopenharmony_ci            self.clear()
7437db96d56Sopenharmony_ci        else:
7447db96d56Sopenharmony_ci            for value in it:
7457db96d56Sopenharmony_ci                self.discard(value)
7467db96d56Sopenharmony_ci        return self
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ciMutableSet.register(set)
7507db96d56Sopenharmony_ci
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci### MAPPINGS ###
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ciclass Mapping(Collection):
7557db96d56Sopenharmony_ci    """A Mapping is a generic container for associating key/value
7567db96d56Sopenharmony_ci    pairs.
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci    This class provides concrete generic implementations of all
7597db96d56Sopenharmony_ci    methods except for __getitem__, __iter__, and __len__.
7607db96d56Sopenharmony_ci    """
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci    __slots__ = ()
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_ci    # Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set.
7657db96d56Sopenharmony_ci    __abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING
7667db96d56Sopenharmony_ci
7677db96d56Sopenharmony_ci    @abstractmethod
7687db96d56Sopenharmony_ci    def __getitem__(self, key):
7697db96d56Sopenharmony_ci        raise KeyError
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci    def get(self, key, default=None):
7727db96d56Sopenharmony_ci        'D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.'
7737db96d56Sopenharmony_ci        try:
7747db96d56Sopenharmony_ci            return self[key]
7757db96d56Sopenharmony_ci        except KeyError:
7767db96d56Sopenharmony_ci            return default
7777db96d56Sopenharmony_ci
7787db96d56Sopenharmony_ci    def __contains__(self, key):
7797db96d56Sopenharmony_ci        try:
7807db96d56Sopenharmony_ci            self[key]
7817db96d56Sopenharmony_ci        except KeyError:
7827db96d56Sopenharmony_ci            return False
7837db96d56Sopenharmony_ci        else:
7847db96d56Sopenharmony_ci            return True
7857db96d56Sopenharmony_ci
7867db96d56Sopenharmony_ci    def keys(self):
7877db96d56Sopenharmony_ci        "D.keys() -> a set-like object providing a view on D's keys"
7887db96d56Sopenharmony_ci        return KeysView(self)
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_ci    def items(self):
7917db96d56Sopenharmony_ci        "D.items() -> a set-like object providing a view on D's items"
7927db96d56Sopenharmony_ci        return ItemsView(self)
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci    def values(self):
7957db96d56Sopenharmony_ci        "D.values() -> an object providing a view on D's values"
7967db96d56Sopenharmony_ci        return ValuesView(self)
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ci    def __eq__(self, other):
7997db96d56Sopenharmony_ci        if not isinstance(other, Mapping):
8007db96d56Sopenharmony_ci            return NotImplemented
8017db96d56Sopenharmony_ci        return dict(self.items()) == dict(other.items())
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci    __reversed__ = None
8047db96d56Sopenharmony_ci
8057db96d56Sopenharmony_ciMapping.register(mappingproxy)
8067db96d56Sopenharmony_ci
8077db96d56Sopenharmony_ci
8087db96d56Sopenharmony_ciclass MappingView(Sized):
8097db96d56Sopenharmony_ci
8107db96d56Sopenharmony_ci    __slots__ = '_mapping',
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ci    def __init__(self, mapping):
8137db96d56Sopenharmony_ci        self._mapping = mapping
8147db96d56Sopenharmony_ci
8157db96d56Sopenharmony_ci    def __len__(self):
8167db96d56Sopenharmony_ci        return len(self._mapping)
8177db96d56Sopenharmony_ci
8187db96d56Sopenharmony_ci    def __repr__(self):
8197db96d56Sopenharmony_ci        return '{0.__class__.__name__}({0._mapping!r})'.format(self)
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ci    __class_getitem__ = classmethod(GenericAlias)
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci
8247db96d56Sopenharmony_ciclass KeysView(MappingView, Set):
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ci    __slots__ = ()
8277db96d56Sopenharmony_ci
8287db96d56Sopenharmony_ci    @classmethod
8297db96d56Sopenharmony_ci    def _from_iterable(cls, it):
8307db96d56Sopenharmony_ci        return set(it)
8317db96d56Sopenharmony_ci
8327db96d56Sopenharmony_ci    def __contains__(self, key):
8337db96d56Sopenharmony_ci        return key in self._mapping
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci    def __iter__(self):
8367db96d56Sopenharmony_ci        yield from self._mapping
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ci
8397db96d56Sopenharmony_ciKeysView.register(dict_keys)
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ci
8427db96d56Sopenharmony_ciclass ItemsView(MappingView, Set):
8437db96d56Sopenharmony_ci
8447db96d56Sopenharmony_ci    __slots__ = ()
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci    @classmethod
8477db96d56Sopenharmony_ci    def _from_iterable(cls, it):
8487db96d56Sopenharmony_ci        return set(it)
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci    def __contains__(self, item):
8517db96d56Sopenharmony_ci        key, value = item
8527db96d56Sopenharmony_ci        try:
8537db96d56Sopenharmony_ci            v = self._mapping[key]
8547db96d56Sopenharmony_ci        except KeyError:
8557db96d56Sopenharmony_ci            return False
8567db96d56Sopenharmony_ci        else:
8577db96d56Sopenharmony_ci            return v is value or v == value
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci    def __iter__(self):
8607db96d56Sopenharmony_ci        for key in self._mapping:
8617db96d56Sopenharmony_ci            yield (key, self._mapping[key])
8627db96d56Sopenharmony_ci
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ciItemsView.register(dict_items)
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ciclass ValuesView(MappingView, Collection):
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_ci    __slots__ = ()
8707db96d56Sopenharmony_ci
8717db96d56Sopenharmony_ci    def __contains__(self, value):
8727db96d56Sopenharmony_ci        for key in self._mapping:
8737db96d56Sopenharmony_ci            v = self._mapping[key]
8747db96d56Sopenharmony_ci            if v is value or v == value:
8757db96d56Sopenharmony_ci                return True
8767db96d56Sopenharmony_ci        return False
8777db96d56Sopenharmony_ci
8787db96d56Sopenharmony_ci    def __iter__(self):
8797db96d56Sopenharmony_ci        for key in self._mapping:
8807db96d56Sopenharmony_ci            yield self._mapping[key]
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_ci
8837db96d56Sopenharmony_ciValuesView.register(dict_values)
8847db96d56Sopenharmony_ci
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ciclass MutableMapping(Mapping):
8877db96d56Sopenharmony_ci    """A MutableMapping is a generic container for associating
8887db96d56Sopenharmony_ci    key/value pairs.
8897db96d56Sopenharmony_ci
8907db96d56Sopenharmony_ci    This class provides concrete generic implementations of all
8917db96d56Sopenharmony_ci    methods except for __getitem__, __setitem__, __delitem__,
8927db96d56Sopenharmony_ci    __iter__, and __len__.
8937db96d56Sopenharmony_ci    """
8947db96d56Sopenharmony_ci
8957db96d56Sopenharmony_ci    __slots__ = ()
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci    @abstractmethod
8987db96d56Sopenharmony_ci    def __setitem__(self, key, value):
8997db96d56Sopenharmony_ci        raise KeyError
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci    @abstractmethod
9027db96d56Sopenharmony_ci    def __delitem__(self, key):
9037db96d56Sopenharmony_ci        raise KeyError
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci    __marker = object()
9067db96d56Sopenharmony_ci
9077db96d56Sopenharmony_ci    def pop(self, key, default=__marker):
9087db96d56Sopenharmony_ci        '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
9097db96d56Sopenharmony_ci          If key is not found, d is returned if given, otherwise KeyError is raised.
9107db96d56Sopenharmony_ci        '''
9117db96d56Sopenharmony_ci        try:
9127db96d56Sopenharmony_ci            value = self[key]
9137db96d56Sopenharmony_ci        except KeyError:
9147db96d56Sopenharmony_ci            if default is self.__marker:
9157db96d56Sopenharmony_ci                raise
9167db96d56Sopenharmony_ci            return default
9177db96d56Sopenharmony_ci        else:
9187db96d56Sopenharmony_ci            del self[key]
9197db96d56Sopenharmony_ci            return value
9207db96d56Sopenharmony_ci
9217db96d56Sopenharmony_ci    def popitem(self):
9227db96d56Sopenharmony_ci        '''D.popitem() -> (k, v), remove and return some (key, value) pair
9237db96d56Sopenharmony_ci           as a 2-tuple; but raise KeyError if D is empty.
9247db96d56Sopenharmony_ci        '''
9257db96d56Sopenharmony_ci        try:
9267db96d56Sopenharmony_ci            key = next(iter(self))
9277db96d56Sopenharmony_ci        except StopIteration:
9287db96d56Sopenharmony_ci            raise KeyError from None
9297db96d56Sopenharmony_ci        value = self[key]
9307db96d56Sopenharmony_ci        del self[key]
9317db96d56Sopenharmony_ci        return key, value
9327db96d56Sopenharmony_ci
9337db96d56Sopenharmony_ci    def clear(self):
9347db96d56Sopenharmony_ci        'D.clear() -> None.  Remove all items from D.'
9357db96d56Sopenharmony_ci        try:
9367db96d56Sopenharmony_ci            while True:
9377db96d56Sopenharmony_ci                self.popitem()
9387db96d56Sopenharmony_ci        except KeyError:
9397db96d56Sopenharmony_ci            pass
9407db96d56Sopenharmony_ci
9417db96d56Sopenharmony_ci    def update(self, other=(), /, **kwds):
9427db96d56Sopenharmony_ci        ''' D.update([E, ]**F) -> None.  Update D from mapping/iterable E and F.
9437db96d56Sopenharmony_ci            If E present and has a .keys() method, does:     for k in E: D[k] = E[k]
9447db96d56Sopenharmony_ci            If E present and lacks .keys() method, does:     for (k, v) in E: D[k] = v
9457db96d56Sopenharmony_ci            In either case, this is followed by: for k, v in F.items(): D[k] = v
9467db96d56Sopenharmony_ci        '''
9477db96d56Sopenharmony_ci        if isinstance(other, Mapping):
9487db96d56Sopenharmony_ci            for key in other:
9497db96d56Sopenharmony_ci                self[key] = other[key]
9507db96d56Sopenharmony_ci        elif hasattr(other, "keys"):
9517db96d56Sopenharmony_ci            for key in other.keys():
9527db96d56Sopenharmony_ci                self[key] = other[key]
9537db96d56Sopenharmony_ci        else:
9547db96d56Sopenharmony_ci            for key, value in other:
9557db96d56Sopenharmony_ci                self[key] = value
9567db96d56Sopenharmony_ci        for key, value in kwds.items():
9577db96d56Sopenharmony_ci            self[key] = value
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci    def setdefault(self, key, default=None):
9607db96d56Sopenharmony_ci        'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
9617db96d56Sopenharmony_ci        try:
9627db96d56Sopenharmony_ci            return self[key]
9637db96d56Sopenharmony_ci        except KeyError:
9647db96d56Sopenharmony_ci            self[key] = default
9657db96d56Sopenharmony_ci        return default
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ci
9687db96d56Sopenharmony_ciMutableMapping.register(dict)
9697db96d56Sopenharmony_ci
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci### SEQUENCES ###
9727db96d56Sopenharmony_ci
9737db96d56Sopenharmony_ciclass Sequence(Reversible, Collection):
9747db96d56Sopenharmony_ci    """All the operations on a read-only sequence.
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci    Concrete subclasses must override __new__ or __init__,
9777db96d56Sopenharmony_ci    __getitem__, and __len__.
9787db96d56Sopenharmony_ci    """
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci    __slots__ = ()
9817db96d56Sopenharmony_ci
9827db96d56Sopenharmony_ci    # Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set.
9837db96d56Sopenharmony_ci    __abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_ci    @abstractmethod
9867db96d56Sopenharmony_ci    def __getitem__(self, index):
9877db96d56Sopenharmony_ci        raise IndexError
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_ci    def __iter__(self):
9907db96d56Sopenharmony_ci        i = 0
9917db96d56Sopenharmony_ci        try:
9927db96d56Sopenharmony_ci            while True:
9937db96d56Sopenharmony_ci                v = self[i]
9947db96d56Sopenharmony_ci                yield v
9957db96d56Sopenharmony_ci                i += 1
9967db96d56Sopenharmony_ci        except IndexError:
9977db96d56Sopenharmony_ci            return
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci    def __contains__(self, value):
10007db96d56Sopenharmony_ci        for v in self:
10017db96d56Sopenharmony_ci            if v is value or v == value:
10027db96d56Sopenharmony_ci                return True
10037db96d56Sopenharmony_ci        return False
10047db96d56Sopenharmony_ci
10057db96d56Sopenharmony_ci    def __reversed__(self):
10067db96d56Sopenharmony_ci        for i in reversed(range(len(self))):
10077db96d56Sopenharmony_ci            yield self[i]
10087db96d56Sopenharmony_ci
10097db96d56Sopenharmony_ci    def index(self, value, start=0, stop=None):
10107db96d56Sopenharmony_ci        '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
10117db96d56Sopenharmony_ci           Raises ValueError if the value is not present.
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ci           Supporting start and stop arguments is optional, but
10147db96d56Sopenharmony_ci           recommended.
10157db96d56Sopenharmony_ci        '''
10167db96d56Sopenharmony_ci        if start is not None and start < 0:
10177db96d56Sopenharmony_ci            start = max(len(self) + start, 0)
10187db96d56Sopenharmony_ci        if stop is not None and stop < 0:
10197db96d56Sopenharmony_ci            stop += len(self)
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci        i = start
10227db96d56Sopenharmony_ci        while stop is None or i < stop:
10237db96d56Sopenharmony_ci            try:
10247db96d56Sopenharmony_ci                v = self[i]
10257db96d56Sopenharmony_ci            except IndexError:
10267db96d56Sopenharmony_ci                break
10277db96d56Sopenharmony_ci            if v is value or v == value:
10287db96d56Sopenharmony_ci                return i
10297db96d56Sopenharmony_ci            i += 1
10307db96d56Sopenharmony_ci        raise ValueError
10317db96d56Sopenharmony_ci
10327db96d56Sopenharmony_ci    def count(self, value):
10337db96d56Sopenharmony_ci        'S.count(value) -> integer -- return number of occurrences of value'
10347db96d56Sopenharmony_ci        return sum(1 for v in self if v is value or v == value)
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ciSequence.register(tuple)
10377db96d56Sopenharmony_ciSequence.register(str)
10387db96d56Sopenharmony_ciSequence.register(range)
10397db96d56Sopenharmony_ciSequence.register(memoryview)
10407db96d56Sopenharmony_ci
10417db96d56Sopenharmony_ci
10427db96d56Sopenharmony_ciclass ByteString(Sequence):
10437db96d56Sopenharmony_ci    """This unifies bytes and bytearray.
10447db96d56Sopenharmony_ci
10457db96d56Sopenharmony_ci    XXX Should add all their methods.
10467db96d56Sopenharmony_ci    """
10477db96d56Sopenharmony_ci
10487db96d56Sopenharmony_ci    __slots__ = ()
10497db96d56Sopenharmony_ci
10507db96d56Sopenharmony_ciByteString.register(bytes)
10517db96d56Sopenharmony_ciByteString.register(bytearray)
10527db96d56Sopenharmony_ci
10537db96d56Sopenharmony_ci
10547db96d56Sopenharmony_ciclass MutableSequence(Sequence):
10557db96d56Sopenharmony_ci    """All the operations on a read-write sequence.
10567db96d56Sopenharmony_ci
10577db96d56Sopenharmony_ci    Concrete subclasses must provide __new__ or __init__,
10587db96d56Sopenharmony_ci    __getitem__, __setitem__, __delitem__, __len__, and insert().
10597db96d56Sopenharmony_ci    """
10607db96d56Sopenharmony_ci
10617db96d56Sopenharmony_ci    __slots__ = ()
10627db96d56Sopenharmony_ci
10637db96d56Sopenharmony_ci    @abstractmethod
10647db96d56Sopenharmony_ci    def __setitem__(self, index, value):
10657db96d56Sopenharmony_ci        raise IndexError
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci    @abstractmethod
10687db96d56Sopenharmony_ci    def __delitem__(self, index):
10697db96d56Sopenharmony_ci        raise IndexError
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci    @abstractmethod
10727db96d56Sopenharmony_ci    def insert(self, index, value):
10737db96d56Sopenharmony_ci        'S.insert(index, value) -- insert value before index'
10747db96d56Sopenharmony_ci        raise IndexError
10757db96d56Sopenharmony_ci
10767db96d56Sopenharmony_ci    def append(self, value):
10777db96d56Sopenharmony_ci        'S.append(value) -- append value to the end of the sequence'
10787db96d56Sopenharmony_ci        self.insert(len(self), value)
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ci    def clear(self):
10817db96d56Sopenharmony_ci        'S.clear() -> None -- remove all items from S'
10827db96d56Sopenharmony_ci        try:
10837db96d56Sopenharmony_ci            while True:
10847db96d56Sopenharmony_ci                self.pop()
10857db96d56Sopenharmony_ci        except IndexError:
10867db96d56Sopenharmony_ci            pass
10877db96d56Sopenharmony_ci
10887db96d56Sopenharmony_ci    def reverse(self):
10897db96d56Sopenharmony_ci        'S.reverse() -- reverse *IN PLACE*'
10907db96d56Sopenharmony_ci        n = len(self)
10917db96d56Sopenharmony_ci        for i in range(n//2):
10927db96d56Sopenharmony_ci            self[i], self[n-i-1] = self[n-i-1], self[i]
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci    def extend(self, values):
10957db96d56Sopenharmony_ci        'S.extend(iterable) -- extend sequence by appending elements from the iterable'
10967db96d56Sopenharmony_ci        if values is self:
10977db96d56Sopenharmony_ci            values = list(values)
10987db96d56Sopenharmony_ci        for v in values:
10997db96d56Sopenharmony_ci            self.append(v)
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci    def pop(self, index=-1):
11027db96d56Sopenharmony_ci        '''S.pop([index]) -> item -- remove and return item at index (default last).
11037db96d56Sopenharmony_ci           Raise IndexError if list is empty or index is out of range.
11047db96d56Sopenharmony_ci        '''
11057db96d56Sopenharmony_ci        v = self[index]
11067db96d56Sopenharmony_ci        del self[index]
11077db96d56Sopenharmony_ci        return v
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci    def remove(self, value):
11107db96d56Sopenharmony_ci        '''S.remove(value) -- remove first occurrence of value.
11117db96d56Sopenharmony_ci           Raise ValueError if the value is not present.
11127db96d56Sopenharmony_ci        '''
11137db96d56Sopenharmony_ci        del self[self.index(value)]
11147db96d56Sopenharmony_ci
11157db96d56Sopenharmony_ci    def __iadd__(self, values):
11167db96d56Sopenharmony_ci        self.extend(values)
11177db96d56Sopenharmony_ci        return self
11187db96d56Sopenharmony_ci
11197db96d56Sopenharmony_ci
11207db96d56Sopenharmony_ciMutableSequence.register(list)
11217db96d56Sopenharmony_ciMutableSequence.register(bytearray)  # Multiply inheriting, see ByteString
1122