o $a@sBdZddlZddlmZmZmZGdddZGdddeZdS)z sphinx.ext.napoleon.iterators ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A collection of helpful iterators. :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. N)AnyIterableOptionalc@seZdZdZdeddfddZdddZdd edefd d Zd e eddfd d Z de fddZ dd edefddZ dd e edefddZdS) peek_iteralAn iterator object that supports peeking ahead. Parameters ---------- o : iterable or callable `o` is interpreted very differently depending on the presence of `sentinel`. If `sentinel` is not given, then `o` must be a collection object which supports either the iteration protocol or the sequence protocol. If `sentinel` is given, then `o` must be a callable object. sentinel : any value, optional If given, the iterator will call `o` with no arguments for each call to its `next` method; if the value returned is equal to `sentinel`, :exc:`StopIteration` will be raised, otherwise the value will be returned. See Also -------- `peek_iter` can operate as a drop in replacement for the built-in `iter `_ function. Attributes ---------- sentinel The value used to indicate the iterator is exhausted. If `sentinel` was not given when the `peek_iter` was instantiated, then it will be set to a new object instance: ``object()``. argsreturnNcGs:t||_t|_t|dkr|d|_dSt|_dS)z__init__(o, sentinel=None)N)iter _iterable collectionsdeque_cachelensentinelobject)selfrr?/usr/lib/python3/dist-packages/sphinx/ext/napoleon/iterators.py__init__2s    zpeek_iter.__init__cC|SNrrrrr__iter__;szpeek_iter.__iter__ncCs ||Sr)nextrrrrr__next__>s zpeek_iter.__next__cCs|sd}zt|j|kr|jt|jt|j|ks WdSWdStyCt|j|kr@|j|jt|j|ks/YdSYdSw)z{z"peek_iter.next..)r rrrr#rangerrresultrrrr  zpeek_iter.nextcs:||durjd}|Sfddt|D}|S)ahPreview the next item or `n` items of the iterator. The iterator is not advanced when peek is called. Returns ------- item or list of items The next item or `n` items of the iterator. If `n` is None, the item itself is returned. If `n` is an int, the items will be returned in a list. If `n` is 0, an empty list is returned. If the iterator is exhausted, `peek_iter.sentinel` is returned, or placed as the last item in the returned list. Note ---- Will never raise :exc:`StopIteration`. Nrcsg|]}j|qSr)rr$rrrr'r(z"peek_iter.peek..)r rr)r*rrrr!~s  zpeek_iter.peek)rrr)__name__ __module__ __qualname____doc__rrrintrrr boolr"rr!rrrrrs  #rcsDeZdZdZdededdffdd Zdeeddfd d ZZ S) modify_iteraTAn iterator object that supports modifying items as they are returned. Parameters ---------- o : iterable or callable `o` is interpreted very differently depending on the presence of `sentinel`. If `sentinel` is not given, then `o` must be a collection object which supports either the iteration protocol or the sequence protocol. If `sentinel` is given, then `o` must be a callable object. sentinel : any value, optional If given, the iterator will call `o` with no arguments for each call to its `next` method; if the value returned is equal to `sentinel`, :exc:`StopIteration` will be raised, otherwise the value will be returned. modifier : callable, optional The function that will be used to modify each item returned by the iterator. `modifier` should take a single argument and return a single value. Defaults to ``lambda x: x``. If `sentinel` is not given, `modifier` must be passed as a keyword argument. Attributes ---------- modifier : callable `modifier` is called with each item in `o` as it is iterated. The return value of `modifier` is returned in lieu of the item. Values returned by `peek` as well as `next` are affected by `modifier`. However, `modify_iter.sentinel` is never passed through `modifier`; it will always be returned from `peek` unmodified. Example ------- >>> a = [" A list ", ... " of strings ", ... " with ", ... " extra ", ... " whitespace. "] >>> modifier = lambda s: s.strip().replace('with', 'without') >>> for s in modify_iter(a, modifier=modifier): ... print('"%s"' % s) "A list" "of strings" "without" "extra" "whitespace." rkwargsrNcsdd|vr |d|_nt|dkr|d|_|dd}ndd|_t|js*tdtj|dS)z0__init__(o, sentinel=None, modifier=lambda x: x)modifierrNcSrrr)xrrrsz&modify_iter.__init__..z3modify_iter(o, modifier): modifier must be callable)r4rcallable TypeErrorsuperr)rrr3 __class__rrrs     zmodify_iter.__init__rcCs|sd}z t|j|kr"|j|t|jt|j|ks WdSWdStyFt|j|krC|j|jt|j|ks2YdSYdSw)zCache `n` modified items. If `n` is 0 or None, 1 item is cached. Each item returned by the iterator is passed through the `modify_iter.modified` function before being cached. r N)rrrr4rr rrrrrrr s zmodify_iter._fillcache) r,r-r.r/rrrr0r __classcell__rrr:rr2s6r2)r/r typingrrrrr2rrrrs