module QuantLib.Stochastic.Discretize
        ( module QuantLib.Stochastic.Discretize )
        where

import QuantLib.Stochastic.Process

-- | Euler discretization of stochastic processes
data Euler = Euler { eDt :: Double }
        deriving (Show, Eq)

-- | Euler end-point discretization of stochastic processes
data EndEuler = EndEuler { eeDt :: Double }
        deriving (Show, Eq)

instance Discretize Euler where
        dDrift p e dot = drift p dot * eDt e
        dDiff  p e dot = diff  p dot * sqrt (eDt e)
        dDt    _ e _   = eDt e

instance Discretize EndEuler where
        dDrift p e dot = drift p nextDot * eeDt e
                where nextDot = Dot (getT dot + eeDt e) (getX dot)
        dDiff  p e dot =  diff  p nextDot * sqrt (eeDt e)
                where nextDot = Dot (getT dot + eeDt e) (getX dot)
        dDt    _ e _   = eeDt e