composer.js
function visit (composition, f) {
  composition = Object.assign({}, composition) // copy
  const combinator = composition['.combinator']()
  if (combinator.components) {
    composition.components = composition.components.map(f)
  }
  for (let arg of combinator.args || []) {
    if (arg.type === undefined && composition[arg.name] !== undefined) {
      composition[arg.name] = f(composition[arg.name], arg.name)
    }
  }
  return new Composition(composition)
}
function visit (composition, f) {
  composition = Object.assign({}, composition) // copy
  const combinator = composition['.combinator']()
  if (combinator.components) {
    composition.components = composition.components.map(f)
  }
  for (let arg of combinator.args || []) {
    if (arg.type === undefined && composition[arg.name] !== undefined) {
      composition[arg.name] = f(composition[arg.name], arg.name)
    }
  }
  return new Composition(composition)
}
function visit ( composition , f ) { composition = Object . assign ( { } , composition ) // copy const combinator = composition [ '.combinator' ] ( ) if ( combinator . components ) { composition . components = composition . components . map ( f ) } for ( let arg of combinator . args || [ ] ) { if ( arg . type === undefined && composition [ arg . name ] !== undefined ) { composition [ arg . name ] = f ( composition [ arg . name ] , arg . name ) } } return new Composition ( composition ) }
apply f to all fields of type composition
apply f to all fields of type composition