signals-0.2.0.1: src/Signal/Core/Stream.hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
module Signal.Core.Stream where
import Control.Monad.Operational.Higher
import Control.Applicative
import Control.Monad
import Prelude ((.), ($))
--------------------------------------------------------------------------------
-- * Streams
--------------------------------------------------------------------------------
-- | Imperative model of co-iterative streams
data Stream (instr :: (* -> *) -> * -> *) (a :: *)
where
Stream :: Program instr (Program instr a) -> Stream instr a
-- | `Shorthand` for streams which produce values of type `exp a`
type Str instr a = Stream instr (IExp instr a)
--------------------------------------------------------------------------------
-- **
-- | ...
repeat :: (e ~ IExp instr) => e a -> Str instr a
repeat = Stream . return . return
-- | ...
map :: (e ~ IExp instr) => (e a -> e b) -> Str instr a -> Str instr b
map f (Stream s) = Stream $ fmap (fmap f) s
--------------------------------------------------------------------------------
-- **
-- | Run stream to produce transition action
run :: Stream instr a -> Program instr a
run (Stream init) = join init
--------------------------------------------------------------------------------