in src/composer/composer.py [0:0]
def lower(self, combinators = []):
''' recursively lower combinators to the desired set of combinators (including primitive combinators) '''
if not isinstance(combinators, list) and not isinstance(combinators, str):
raise ComposerError('Invalid argument "combinators" in "lower"', combinators)
def lower(composition, _):
# repeatedly lower root combinator
while 'def' in getattr(composition, '.combinator')():
path = composition.path if hasattr(composition, 'path') else None
combinator = getattr(composition, '.combinator')()
if isinstance(combinator, list) and combinator.indexOf(composition.type) >= 0:
break
# map argument names to positions
args = []
skip = len(combinator.get('args', []))
for i in range(skip):
args.append(getattr(composition, combinator['args'][i]['name']))
if 'components' in combinator:
args.extend(composition.components)
composition = combinator['def'](*args)
# preserve path
if path is not None:
composition.path = path
return visit(composition, lower)
return lower(self, None)