module Math.Integrators 
    where
import Data.Vector (Vector,(!))
import Data.Vector.Mutable
import Control.Monad.Primitive
import qualified Data.Vector as V
import Math.Integrators.Internal
integrateV :: PrimMonad m => Integrator a       
                          -> a                  
                          -> Vector Double      
                          -> m (Vector a)       
integrateV integrator initial times = do
    out <- new (V.length times) 
    write out 0 initial
    compute initial 1 out
    V.unsafeFreeze out
    where
        compute y i out | i == V.length times = return () 
                        | otherwise = do
            let h  = (times ! i)  (times ! (i1))
                y' = integrator h y
            write out i y'
            compute y' (i+1) out