-- | Monadic Stream Functions are synchronized stream functions -- with side effects. -- -- 'MSF's are defined by a function -- @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@ -- that executes one step of a simulation, and produces an output in a -- monadic context, and a continuation to be used for future steps. -- -- See the module "Data.MonadicStreamFunction.Core" for details. -- -- 'MSF's are a generalisation of the implementation mechanism used by Yampa, -- Wormholes and other FRP and reactive implementations. -- -- When combined with different monads, they produce interesting effects. For -- example, when combined with the 'Maybe' monad, they become transformations -- that may stop producing outputs (and continuations). The 'Either' monad -- gives rise to 'MSF's that end with a result (akin to Tasks in Yampa, and -- Monadic FRP). -- -- Flattening, that is, going from some structure @MSF (t m) a b@ to @MSF m a b@ -- for a specific transformer @t@ often gives rise to known FRP constructs. -- For instance, flattening with 'EitherT' gives rise to switching, and -- flattening with 'ListT' gives rise to parallelism with broadcasting. -- -- 'MSF's can be used to implement many FRP variants, including Arrowized FRP, -- Classic FRP, and plain reactive programming. Arrowized and applicative -- syntax are both supported. -- -- For a very detailed introduction to 'MSF's, see: -- <http://dl.acm.org/citation.cfm?id=2976010> -- (mirror: <http://www.cs.nott.ac.uk/~psxip1/#FRPRefactored>). -- -- Apart from the modules exported, this module exports instances from: -- -- - "Data.MonadicStreamFunction.Instances.ArrowChoice" -- - "Data.MonadicStreamFunction.Instances.ArrowLoop" -- - "Data.MonadicStreamFunction.Instances.ArrowPlus" module Data.MonadicStreamFunction ( module Control.Arrow , module Data.MonadicStreamFunction.Core , module Data.MonadicStreamFunction.Util ) where -- External import Control.Arrow -- Internal import Data.MonadicStreamFunction.Core import Data.MonadicStreamFunction.Util -- Internal (Instances) import Data.MonadicStreamFunction.Instances.ArrowChoice () import Data.MonadicStreamFunction.Instances.ArrowLoop () import Data.MonadicStreamFunction.Instances.ArrowPlus ()