a `]_J@sddlmZmZmZmZddlmZddlmZddZ Gddde Z e e e e e e e e dd Z d d Ze eZd S) ) ContainerIterableSizedHashable)reduce)pmapcCs||||ddS)Nr)setget)Zcounterselementr 6/usr/lib64/python3.9/site-packages/pyrsistent/_pbag.py_add_to_counterssrc@seZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZeZeZeZddZddZddZdd Zd!d"Zd#S)$PBaga A persistent bag/multiset type. Requires elements to be hashable, and allows duplicates, but has no ordering. Bags are hashable. Do not instantiate directly, instead use the factory functions :py:func:`b` or :py:func:`pbag` to create an instance. Some examples: >>> s = pbag([1, 2, 3, 1]) >>> s2 = s.add(4) >>> s3 = s2.remove(1) >>> s pbag([1, 1, 2, 3]) >>> s2 pbag([1, 1, 2, 3, 4]) >>> s3 pbag([1, 2, 3, 4]) )_counts __weakref__cCs ||_dS)Nr)selfZcountsr r r __init__#sz PBag.__init__cCstt|j|S)z Add an element to the bag. >>> s = pbag([1]) >>> s2 = s.add(1) >>> s3 = s.add(2) >>> s2 pbag([1, 1]) >>> s3 pbag([1, 2]) )rrrrr r r r add&s zPBag.addcCs|rttt||jS|S)z Update bag with all elements in iterable. >>> s = pbag([1]) >>> s.update([1, 2]) pbag([1, 1, 2]) )rrrr)riterabler r r update4sz PBag.updatecCsP||jvrt|n4|j|dkr0|j|}n|j||j|d}t|S)z Remove an element from the bag. >>> s = pbag([1, 1, 2]) >>> s2 = s.remove(1) >>> s3 = s.remove(2) >>> s2 pbag([1, 2]) >>> s3 pbag([1, 1]) r)rKeyErrorremover r)rr Znewcr r r rAs  z PBag.removecCs|j|dS)z Return the number of times an element appears. >>> pbag([]).count('non-existent') 0 >>> pbag([1, 1, 2]).count(1) 2 r)rr rr r r countUs z PBag.countcCst|jS)ze Return the length including duplicates. >>> len(pbag([1, 1, 2])) 3 )sumrZ itervaluesrr r r __len__asz PBag.__len__ccs,|jD]\}}t|D] }|Vqq dS)z Return an iterator of all elements, including duplicates. >>> list(pbag([1, 1, 2])) [1, 1, 2] >>> list(pbag([1, 2])) [1, 2] N)r iteritemsrange)reltrir r r __iter__js  z PBag.__iter__cCs ||jvS)z Check if an element is in the bag. >>> 1 in pbag([1, 1, 2]) True >>> 0 in pbag([1, 2]) False r)rr!r r r __contains__ws zPBag.__contains__cCsdt|S)Nz pbag({0}))formatlistrr r r __repr__sz PBag.__repr__cCs t|turtd|j|jkS)z Check if two bags are equivalent, honoring the number of duplicates, and ignoring insertion order. >>> pbag([1, 1, 2]) == pbag([1, 2]) False >>> pbag([2, 1, 0]) == pbag([0, 1, 2]) True z Can only compare PBag with PBags)typer TypeErrorrrotherr r r __eq__s z PBag.__eq__cCs tddS)NzPBags are not orderable)r)r*r r r __lt__sz PBag.__lt__cCsJt|tstS|j}|jD]\}}|||||<q"t|S)z Combine elements from two PBags. >>> pbag([1, 2, 2]) + pbag([2, 3, 3]) pbag([1, 2, 2, 2, 3, 3]) ) isinstancerNotImplementedrevolverrr persistent)rr+resultelem other_countr r r __add__s   z PBag.__add__cCsjt|tstS|j}|jD]:\}}|||}|dkrJ|||<q"||vr"||q"t|S)z Remove elements from one PBag that are present in another. >>> pbag([1, 2, 2, 2, 3]) - pbag([2, 3, 3, 4]) pbag([1, 2, 2]) r) r.rr/rr0rrrr1)rr+r2r3r4newcountr r r __sub__s    z PBag.__sub__cCsTt|tstS|j}|jD]$\}}||}t||}|||<q"t|S)z Union: Keep elements that are present in either of two PBags. >>> pbag([1, 2, 2, 2]) | pbag([2, 3, 3]) pbag([1, 2, 2, 2, 3, 3]) ) r.rr/rr0rrmaxr1)rr+r2r3r4rr6r r r __or__s     z PBag.__or__cCsXt|tstSt}|jD](\}}t|||}|dkr"|||<q"t| S)z Intersection: Only keep elements that are present in both PBags. >>> pbag([1, 2, 2, 2]) & pbag([2, 3, 3]) pbag([2]) r) r.rr/rr0rrminrr1)rr+r2r3rr6r r r __and__s   z PBag.__and__cCs t|jS)z Hash based on value of elements. >>> m = pmap({pbag([1, 2]): "it's here!"}) >>> m[pbag([2, 1])] "it's here!" >>> pbag([1, 1, 2]) in m False )hashrrr r r __hash__s z PBag.__hash__N)__name__ __module__ __qualname____doc__ __slots__rrrrrrr#r$r'r,r-__le____gt____ge__r5r7r9r;r=r r r r r s*     rcGst|S)z Construct a persistent bag. Takes an arbitrary number of arguments to insert into the new persistent bag. >>> b(1, 2, 3, 2) pbag([1, 2, 2, 3]) )pbagelementsr r r bs rIcCs|stSttt|tS)z Convert an iterable to a persistent bag. Takes an iterable with elements to insert. >>> pbag([1, 2, 3, 2]) pbag([1, 2, 2, 3]) ) _EMPTY_PBAGrrrrrGr r r rFs rFN)collections.abcrrrr functoolsrZpyrsistent._pmaprrobjectrregisterrIrFrJr r r r s  `