def lower()

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)