# AUTOGENERATED FILE! PLEASE DON'T EDIT
settings = {"defaultDelim": "\t", "defaultIndent": " ",
"oboFile": None, "strict": False, "lookupImgs": True}
[docs]def patchDefaultDelim(s:str):
"""
:param s:
- if not None, returns self
- else returns the default delimiter in settings"""
return settings["defaultDelim"] if s is None else s
[docs]def patchDefaultIndent(s:str):
"""
:param s:
- if not None, returns self
- else returns the default indent character in settings"""
return settings["defaultIndent"] if s is None else s
from typing import List, Iterator, Any
import itertools
[docs]class BaseCli:
def __and__(self, cli:"BaseCli"):
if isinstance(self, oneToMany):
self.clis.append(cli); return self
if isinstance(cli, oneToMany):
cli.clis.append(self); return cli
return oneToMany(self, cli)
def __add__(self, cli):
if isinstance(self, manyToManySpecific):
self.clis.append(cli); return self
if isinstance(cli, manyToManySpecific):
cli.clis.append(self); return cli
return manyToManySpecific(self, cli)
[docs] def all(self) -> "BaseCli":
"""Applies this BaseCli to all incoming streams"""
return manyToMany(self)
def __or__(self, it):
if isinstance(it, BaseCli):
return serial(self, it)
[docs] def f(self):
"""Creates a normal function :math:`f(x)` which is equivalent to
``x | self``."""
return lambda it: self.__ror__(it)
def __lt__(self, it):
"""Default backup join symbol `>`, in case `it` implements __ror__()"""
return self.__ror__(it)
[docs]class serial(BaseCli):
[docs] def __init__(self, *clis:List[BaseCli]):
"""Merges clis into 1, feeding end to end. Used in chaining clis
together without a prime iterator. Meaning, without this, stuff like this
fails to run::
[1, 2] | a() | b() # runs
c = a() | b(); [1, 2] | c # doesn't run if this class doesn't exist
"""
self.clis = clis
[docs] def __ror__(self, it:Iterator[Any]) -> Iterator[Any]:
for cli in self.clis: it = cli.__ror__(it)
return it
[docs]class oneToMany(BaseCli):
[docs] def __init__(self, *clis:List[BaseCli]):
"""Duplicates 1 stream into multiple streams, each for a cli in the
list. Used in the "a & b" joining operator"""
self.clis = clis
[docs] def __ror__(self, it:Iterator[Any]) -> Iterator[Iterator[Any]]:
its = itertools.tee(it, len(self.clis))
for cli, it in zip(self.clis, its):
yield cli.__ror__(it)
[docs]class manyToMany(BaseCli):
[docs] def __init__(self, cli):
"""Applies multiple streams to a single cli. Used in the "a.all()"
operator."""
self.cli = cli
[docs] def __ror__(self, it:Iterator[Iterator[Any]]) -> Iterator[Iterator[Any]]:
for stream in it: yield self.cli.__ror__(stream)
[docs]class manyToManySpecific(BaseCli):
[docs] def __init__(self, *clis:List[BaseCli]):
"""Applies multiple streams to multiple clis independently. Used in
the "a + b" joining operator """
self.clis = clis
[docs] def __ror__(self, its:Iterator[Any]) -> Iterator[Any]:
for cli, it in zip(self.clis, its):
yield cli.__ror__(it)