from ...core.operator import is_operator from functools import partial from ...core.str2 import ( concurent_broadcast, lookforNumbers, pparser, missing_times, lookfor, ) from ...core.coroutine import STOOOP from ...core.MO import moify_cor from .leaf import look_for_rdleaf def rdstr2(sink): """Return a pipeline which parse random expression and with sink as endpoint :example: >>> from ...core.str2 import list_sink >>> rdstr2list = rdstr2(list_sink) >>> rdstr2list("{a}+{a*b}-2") [, '+', , '+', ] >>> rdstr2list("{a}({b}x+{c})") [, '*', [, '*', , '+', ]] """ lfop = lookfor(is_operator) operator_corout = partial(concurent_broadcast, lookfors=[lfop]) def pipeline(expression): str2_corout = look_for_rdleaf( lookforNumbers(operator_corout(missing_times(moify_cor(pparser(sink))))) ) for i in expression.replace(" ", ""): str2_corout.send(i) a = str2_corout.throw(STOOOP) return a return pipeline