decorater that zips the input of a function with its output 
        only zips positional arguments.

        skip_args : list
            a list of indexes of arguments to exclude from the skip

            @zip_with_output(skip_args=[0])
            def foo(bar, baz):
                return baz

        will decorate foo s.t.

            foo(x, y) = y

def zip_with_output(skip_args=[]):
    """decorater that zips the input of a function with its output 
        only zips positional arguments.

        skip_args : list
            a list of indexes of arguments to exclude from the skip

            @zip_with_output(skip_args=[0])
            def foo(bar, baz):
                return baz

        will decorate foo s.t.

            foo(x, y) = y
    """
    def decorator(fn):
        def wrapped(*args, **vargs):
            g = [arg for i, arg in enumerate(args) if i not in skip_args]
            if len(g) == 1:
                return(g[0], fn(*args, **vargs))
            else:
                return (g, fn(*args, **vargs))
        return wrapped
    return decorator