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