module FRP.NetWire.Calculus
(
derivative,
derivativeFrom,
integral
)
where
import Control.DeepSeq
import Data.VectorSpace
import FRP.NetWire.Wire
derivative :: (Monad m, NFData v, VectorSpace v, Scalar v ~ Double) => Wire m v v
derivative =
mkGen $ \_ y2 ->
return (Left (inhibitEx "Derivative at first instant"),
derivativeFrom y2)
derivativeFrom :: (Monad m, NFData v, VectorSpace v, Scalar v ~ Double) => v -> Wire m v v
derivativeFrom y1 =
mkGen $ \(wsDTime -> dt) y2 -> do
let dy = (y2 ^-^ y1) ^/ dt
dy `deepseq` return (Right dy, derivativeFrom y2)
integral :: (Monad m, NFData v, VectorSpace v, Scalar v ~ Double) => v -> Wire m v v
integral x1 =
mkGen $ \ws dx -> do
let dt = wsDTime ws
x2 = x1 ^+^ dt *^ dx
x2 `deepseq` return (Right x2, integral x2)