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)