code: def merge(arg, *rest, **kwargs):
      ensure_keyword_args(kwargs, optional=('default',))
      has_default = 'default' in kwargs
      if has_default:
          default = ensure_callable(kwargs['default'])
      unary_result = True
      if rest:
          fs = (ensure_callable(arg),) + tuple(imap(ensure_callable, rest))
          unary_result = False
      else:
          fs = arg
      if is_mapping(fs):
          if has_default:
              return lambda arg_: fs.__class__((k, fs.get(k, default)(arg_[k]))
                                               for k in arg_)
          else:
              return lambda arg_: fs.__class__((k, fs[k](arg_[k]))
                                               for k in arg_)
      else:
          ensure_sequence(fs)
          if has_default:
              func = lambda arg_: fs.__class__(
                  (fs[i] if i < len(fs) else default)(x)
                  for i, x in enumerate(arg_))
          else:
              func = lambda arg_: fs.__class__(fs[i](x)
                                               for i, x in enumerate(arg_))
          return func if unary_result else lambda *args: func(args)