Source code for xonsh.lib.itertools
from itertools import filterfalse
[docs]
def as_iterable(iterable_or_scalar):
"""Utility for converting an object to an iterable.
Parameters
----------
iterable_or_scalar : anything
Returns
-------
l : iterable
If `obj` was None, return the empty tuple.
If `obj` was not iterable returns a 1-tuple containing `obj`.
Otherwise return `obj`
Notes
-----
Although string types are iterable in Python, we are treating them as not iterable in this
method. Thus, as_iterable(string) returns (string, )
Examples
---------
>>> as_iterable(1)
(1,)
>>> as_iterable([1, 2, 3])
[1, 2, 3]
>>> as_iterable("my string")
("my string", )
"""
if iterable_or_scalar is None:
return ()
elif isinstance(iterable_or_scalar, (str, bytes)):
return (iterable_or_scalar,)
elif hasattr(iterable_or_scalar, "__iter__"):
return iterable_or_scalar
else:
return (iterable_or_scalar,)
[docs]
def unique_everseen(iterable, key=None):
"""Yield unique elements, preserving order. Remember all elements ever seen.
```
unique_everseen('AAAABBBCCDAABBB') → A B C D
unique_everseen('ABBcCAD', str.casefold) → A B c D
```
Source code: https://docs.python.org/3/library/itertools.html#itertools-recipes
"""
seen = set()
if key is None:
for element in filterfalse(seen.__contains__, iterable):
seen.add(element)
yield element
else:
for element in iterable:
k = key(element)
if k not in seen:
seen.add(k)
yield element