{-# LANGUAGE Arrows #-}
module FRP.BearRiver.Integration
(
integral
, derivative
, iterFrom
)
where
import Control.Arrow (returnA)
import Data.VectorSpace (VectorSpace, zeroVector, (*^), (^+^), (^-^), (^/))
import Control.Monad.Trans.MSF (ask)
import Data.MonadicStreamFunction (accumulateWith, constM, iPre)
import Data.MonadicStreamFunction.InternalCore (MSF (MSF))
import FRP.BearRiver.InternalCore (DTime, SF)
integral :: (Monad m, Fractional s, VectorSpace a s) => SF m a a
integral :: forall (m :: * -> *) s a.
(Monad m, Fractional s, VectorSpace a s) =>
SF m a a
integral = forall (m :: * -> *) s a.
(Monad m, Fractional s, VectorSpace a s) =>
a -> SF m a a
integralFrom forall v a. VectorSpace v a => v
zeroVector
integralFrom :: (Monad m, Fractional s, VectorSpace a s) => a -> SF m a a
integralFrom :: forall (m :: * -> *) s a.
(Monad m, Fractional s, VectorSpace a s) =>
a -> SF m a a
integralFrom a
a0 = proc a
a -> do
DTime
dt <- forall (m :: * -> *) b a. Monad m => m b -> MSF m a b
constM forall (m :: * -> *) r. Monad m => ReaderT r m r
ask -< ()
forall (m :: * -> *) a s.
Monad m =>
(a -> s -> s) -> s -> MSF m a s
accumulateWith forall v a. VectorSpace v a => v -> v -> v
(^+^) a
a0 -< forall a b. (Real a, Fractional b) => a -> b
realToFrac DTime
dt forall v a. VectorSpace v a => a -> v -> v
*^ a
a
derivative :: (Monad m, Fractional s, VectorSpace a s) => SF m a a
derivative :: forall (m :: * -> *) s a.
(Monad m, Fractional s, VectorSpace a s) =>
SF m a a
derivative = forall (m :: * -> *) s a.
(Monad m, Fractional s, VectorSpace a s) =>
a -> SF m a a
derivativeFrom forall v a. VectorSpace v a => v
zeroVector
derivativeFrom :: (Monad m, Fractional s, VectorSpace a s) => a -> SF m a a
derivativeFrom :: forall (m :: * -> *) s a.
(Monad m, Fractional s, VectorSpace a s) =>
a -> SF m a a
derivativeFrom a
a0 = proc a
a -> do
DTime
dt <- forall (m :: * -> *) b a. Monad m => m b -> MSF m a b
constM forall (m :: * -> *) r. Monad m => ReaderT r m r
ask -< ()
a
aOld <- forall (m :: * -> *) a. Monad m => a -> MSF m a a
iPre a
a0 -< a
a
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< (a
a forall v a. VectorSpace v a => v -> v -> v
^-^ a
aOld) forall v a. VectorSpace v a => v -> a -> v
^/ forall a b. (Real a, Fractional b) => a -> b
realToFrac DTime
dt
iterFrom :: Monad m => (a -> a -> DTime -> b -> b) -> b -> SF m a b
iterFrom :: forall (m :: * -> *) a b.
Monad m =>
(a -> a -> DTime -> b -> b) -> b -> SF m a b
iterFrom a -> a -> DTime -> b -> b
f b
b = forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF forall a b. (a -> b) -> a -> b
$ \a
a -> do
DTime
dt <- forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
let b' :: b
b' = a -> a -> DTime -> b -> b
f a
a a
a DTime
dt b
b
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b, forall (m :: * -> *) a b.
Monad m =>
(a -> a -> DTime -> b -> b) -> b -> SF m a b
iterFrom a -> a -> DTime -> b -> b
f b
b')