def get_full_leapfrog_step(vdfdx, edfdv, field_solve, dt, driver_function):
    """
    This function returns the leapfrog step pieced together with the provided components

    :param vdfdx: (function) the chosen v df/dx integrator
    :param edfdv: (function) the chosen e df/dv integrator
    :param field_solve: (function) the chosen field solver
    :param dt: (float) the time-step
    :param driver_function: (function) the function providing the driver
    :return: (function) above inputs initialized as static variables
    """

    def full_leapfrog_ps_step(e, f, t):
        """
        Takes a step forward in time for f and e

        Uses leapfrog scheme
        1 - spatial advection for 0.5 dt

        2a - field solve
        2b - velocity advection for dt

        3 - spatial advection for 0.5 dt

        :param e: (float array (nx, )) electric field
        :param f: (float array (nx, nv)) distribution function
        :param t: (float) current time
        :return: (float array (nx, nv)) updated distribution function
        """
        f = edfdv(f=f, e=e, dt=0.5 * dt)
        f = vdfdx(f=f, dt=dt)
        e = field_solve(driver_field=driver_function(t + dt), f=f)
        f = edfdv(f=f, e=e, dt=0.5 * dt)

        return e, f

    return full_leapfrog_ps_step