def visit()

in src/composer/composer.py [0:0]


def visit(composition, f):
    ''' apply f to all fields of type composition '''
    composition = copy.copy(composition if isinstance(composition, dict) else composition.__dict__)

    combinator = composition['.combinator']()
    if 'components' in combinator:
        composition['components'] = list(map(lambda v: f(v, None), composition['components']))

    if 'args' in combinator:
        for arg in combinator['args']:
            if 'type' not in arg and arg['name'] in composition:
                composition[arg['name']] = f(composition[arg['name']], arg['name'])

    return Composition(composition)