packages feed

elerea-examples-2.2.1: src/Common/Utils.lhs

Utils module
============

This module contains some functions that might make it into the core library eventually.

> module Common.Utils where
>
> import Control.Applicative
> import Control.Monad
> import FRP.Elerea.Param
>
> import Common.Vector

The `driveNetwork` function simply executes the supersteps while the
`driver` function keeps returning valid delta time values.

> driveNetwork network driver = do
>   dt <- driver
>   case dt of
>     Just dt -> do join (network dt)
>                   driveNetwork network driver
>     Nothing -> return ()

A scalar integral function for `Fractional` instances.

> integral v0 s = transfer v0 (\dt v v0 -> v0+v*realToFrac dt) s

An integral function for two-dimensional vectors defined in the
`Vector` module.

> integralVec v0 s = transfer v0 (\dt v v0 -> v0^+^(v^*.realToFrac dt)) s

A rising edge detector.

> edge s = do
>   s' <- delay False s
>   return $ s' >>= \x -> if x then return False else s

A latch that always remembers the last value of a `Maybe` signal
wrapped in `Just`.

> storeJust x0 s = transfer x0 store s
>     where store _ Nothing  x = x
>           store _ (Just x) _ = x