module Simulation.Aivika.Dynamics.Internal.Cont
(Cont(..),
runCont) where
import Control.Monad
import Control.Monad.Trans
import Simulation.Aivika.Dynamics.Internal.Simulation
import Simulation.Aivika.Dynamics.Internal.Dynamics
newtype Cont a = Cont ((a -> Dynamics ()) -> Dynamics ())
instance Monad Cont where
return = returnC
m >>= k = bindC m k
instance SimulationLift Cont where
liftSimulation = liftSC
instance DynamicsLift Cont where
liftDynamics = liftDC
instance Functor Cont where
fmap = liftM
instance MonadIO Cont where
liftIO = liftIOC
returnC :: a -> Cont a
returnC a = Cont $ \c -> c a
bindC :: Cont a -> (a -> Cont b) -> Cont b
bindC (Cont m) k = Cont $ \c -> m (\a -> let Cont m' = k a in m' c)
runCont :: Cont a -> (a -> Dynamics ()) -> Dynamics ()
runCont (Cont m) = m
liftSC :: Simulation a -> Cont a
liftSC (Simulation m) =
Cont $ \c ->
Dynamics $ \p ->
do a <- m $ pointRun p
let Dynamics m' = c a
m' p
liftDC :: Dynamics a -> Cont a
liftDC (Dynamics m) =
Cont $ \c ->
Dynamics $ \p ->
do a <- m p
let Dynamics m' = c a
m' p
liftIOC :: IO a -> Cont a
liftIOC m =
Cont $ \c ->
Dynamics $ \p ->
do a <- m
let Dynamics m' = c a
m' p