a `Å]_7ã@shddlmZmZddlZddlmZGdd„deƒZe e¡e e¡eeƒƒZ d dd „Z d d „Z dS) é)ÚSetÚHashableN)ÚpmapcseZdZdZdZ‡fdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z e d$dd„ƒZdd„Zdd„Zdd„Zdd„ZGdd„deƒZd d!„Zd"d#„ZejZejZejZejZejZejZejZejZej Z ej!Z!eZ"eZ#eZ$eZ%e Z&e!Z'ej(Z(‡Z)S)%ÚPSeta! Persistent set implementation. Built on top of the persistent map. The set supports all operations in the Set protocol and is Hashable. Do not instantiate directly, instead use the factory functions :py:func:`s` or :py:func:`pset` to create an instance. Random access and insert is log32(n) where n is the size of the set. Some examples: >>> s = pset([1, 2, 3, 1]) >>> s2 = s.add(4) >>> s3 = s2.remove(2) >>> s pset([1, 2, 3]) >>> s2 pset([1, 2, 3, 4]) >>> s3 pset([1, 3, 4]) )Ú_mapÚ __weakref__cstt|ƒ |¡}||_|S©N)ÚsuperrÚ__new__r)ÚclsÚmÚself©Ú __class__©ú6/usr/lib64/python3.9/site-packages/pyrsistent/_pset.pyr sz PSet.__new__cCs ||jvSr)r©r ÚelementrrrÚ __contains__#szPSet.__contains__cCs t|jƒSr)Úiterr©r rrrÚ__iter__&sz PSet.__iter__cCs t|jƒSr)ÚlenrrrrrÚ__len__)sz PSet.__len__cCs.|sdtt|ƒƒSd tt|ƒƒdd…¡S)NÚpz pset([{0}])ééÿÿÿÿ)ÚstrÚsetÚformatrrrrÚ__repr__,sz PSet.__repr__cCs| ¡Sr)r rrrrÚ__str__2sz PSet.__str__cCs t|jƒSr)ÚhashrrrrrÚ__hash__5sz PSet.__hash__cCstt|ƒffSr)ÚpsetÚlistrrrrÚ __reduce__8szPSet.__reduce__écCstttdd„|Dƒƒ|d�ƒS)Ncss|]}|dfVqdS)TNr)Ú.0ÚkrrrÚ >óz&PSet._from_iterable..©Úpre_size)rrÚdict)r Úitr-rrrÚ_from_iterable<szPSet._from_iterablecCs| ¡ |¡ ¡S)z~ Return a new PSet with element added >>> s1 = s(1, 2) >>> s1.add(3) pset([1, 2, 3]) ©ÚevolverÚaddÚ persistentrrrrr3@szPSet.addcCs$| ¡}|D]}| |¡q | ¡S)z™ Return a new PSet with elements in iterable added >>> s1 = s(1, 2) >>> s1.update([3, 4, 4]) pset([1, 2, 3, 4]) r1)r ÚiterableÚerrrrÚupdateJs z PSet.updatecCs,||jvr| ¡ |¡ ¡Std|ƒ‚dS)z© Return a new PSet with element removed. Raises KeyError if element is not present. >>> s1 = s(1, 2) >>> s1.remove(2) pset([1]) z Element '%s' not present in PSetN)rr2Úremover4ÚKeyErrorrrrrr8Xs z PSet.removecCs ||jvr| ¡ |¡ ¡S|S)zc Return a new PSet with element removed. Returns itself if element is not present. )rr2r8r4rrrrÚdiscardes z PSet.discardc@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)z PSet._Evolver)Ú_original_psetÚ _pmap_evolvercCs||_|j ¡|_dSr)r;rr2r<)r Z original_psetrrrÚ__init__qszPSet._Evolver.__init__cCsd|j|<|S)NT©r<rrrrr3us zPSet._Evolver.addcCs |j|=|Srr>rrrrr8yszPSet._Evolver.removecCs |j ¡Sr)r<Úis_dirtyrrrrr?}szPSet._Evolver.is_dirtycCs| ¡s|jSt|j ¡ƒSr)r?r;rr<r4rrrrr4€szPSet._Evolver.persistentcCs t|jƒSr)rr<rrrrr†szPSet._Evolver.__len__N) Ú__name__Ú __module__Ú __qualname__Ú __slots__r=r3r8r?r4rrrrrÚ_EvolvernsrDcCs|SrrrrrrÚcopy‰sz PSet.copycCs t |¡S)a! Create a new evolver for this pset. For a discussion on evolvers in general see the documentation for the pvector evolver. Create the evolver and perform various mutating updates to it: >>> s1 = s(1, 2, 3) >>> e = s1.evolver() >>> _ = e.add(4) >>> len(e) 4 >>> _ = e.remove(1) The underlying pset remains the same: >>> s1 pset([1, 2, 3]) The changes are kept in the evolver. An updated pmap can be created using the persistent() function on the evolver. >>> s2 = e.persistent() >>> s2 pset([2, 3, 4]) The new pset will share data with the original pset in the same way that would have been done if only using operations on the pset. )rrDrrrrr2Œsz PSet.evolver)r')*r@rArBÚ__doc__rCr rrrr r!r#r&Ú classmethodr0r3r7r8r:ÚobjectrDrEr2rÚ__le__Ú__lt__Ú__gt__Ú__ge__Ú__eq__Ú__ne__Ú__and__Ú__or__Ú__sub__Ú__xor__ÚissubsetÚ issupersetÚunionÚ intersectionÚ differenceÚsymmetric_differenceÚ isdisjointÚ __classcell__rrrrrsH     #rrr'cCs|stStj||d�S)zÆ Creates a persistent set from iterable. Optionally takes a sizing parameter equivalent to that used for :py:func:`pmap`. >>> s1 = pset([1, 2, 3, 2]) >>> s1 pset([1, 2, 3]) r,)Ú _EMPTY_PSETrr0)r5r-rrrr$Ês r$cGst|ƒS)z¥ Create a persistent set. Takes an arbitrary number of arguments to insert into the new set. >>> s1 = s(1, 2, 3, 2) >>> s1 pset([1, 2, 3]) )r$)ÚelementsrrrÚsÙs r])rr') Úcollections.abcrrÚsysZpyrsistent._pmaprrHrÚregisterr[r$r]rrrrÚs ?