"""
This module contains 2 integrators, which is at least 
of second consistency order and approrimately preserves 
the energy over long times.
"""

from collections.abc import Callable

import numpy as np


def verlet(F: Callable, q0: np.ndarray, p0: np.ndarray, m: np.ndarray, dt: float):
    """
    Velocity-Verlet integrator for one time step
    """
    p = p0
    q = q0

    p = p + 1 / 2 * F(q) * dt
    q = q + 1 / m * p * dt
    p = p + 1 / 2 * F(q) * dt

    return p, q