def METHOD_NAME(params, f, matching_f):
    '''params will spread using the matching function (matching_f)
        on the lowest level applies f (function)'''
    is_list = [isinstance(l, (list, tuple)) for l in params]
    if any(is_list):
        res = []
        if not all(is_list):
            l_temp = []
            for l in params:
                if not isinstance(l, (list, tuple)):
                    l_temp.append([l])
                else:
                    l_temp.append(l)
                params = l_temp
        params = matching_f(params)
        for z in zip(*params):
            res.append(METHOD_NAME(z,f, matching_f))
        return res
    else:
        return f(params)