def strang_splitting(U_hat, delta_t, control, expInt, st, linear, nonlinear):
    """
    Propagates a solution for arbitrary linear and nonlinear operators over a timestep
    delta_t by using Strang Splitting.

    **Parameters**

    - `U_hat` : The known solution at the current timestep, in Fourier space
    - `delta_t` : the timestep over which the solution is to be predicted
    - `control` : the control object
    - `expInt` : the exponential integrator (linear term)
    - `st` : spectral toolbox object
    - `linear` : the linear term. May be the same as expInt, but necessary
                 for integration with exp_L_exp_D
    - `nonlinear` : the nonlinear operator being used, i.e. with or without wave averaging

    **Returns**

    - `U_hat_new` : The computed U_hat at the next timestep

    """

    U_hat_new = linear(control, expInt, U_hat, 0.5*delta_t)
    # Computation of midpoint:
    U_NL_hat = nonlinear(U_hat_new, control, st, expInt)
    U_NL_hat1 = -delta_t*U_NL_hat

    U_NL_hat = nonlinear(U_hat_new + 0.5*U_NL_hat1, control, st, expInt)
    U_NL_hat2 = -delta_t*U_NL_hat
    U_hat_new = U_hat_new + U_NL_hat2

    U_hat_new = linear(control, expInt, U_hat_new, 0.5*delta_t)
    return U_hat_new