Yampa-0.10.0: src/FRP/Yampa/Scan.hs
{-# LANGUAGE GADTs, Rank2Types, CPP #-}
-----------------------------------------------------------------------------------------
-- |
-- Module : FRP.Yampa.Scan
-- Copyright : (c) Antony Courtney and Henrik Nilsson, Yale University, 2003
-- License : BSD-style (see the LICENSE file in the distribution)
--
-- Maintainer : ivan.perez@keera.co.uk
-- Stability : provisional
-- Portability : non-portable (GHC extensions)
-----------------------------------------------------------------------------------------
module FRP.Yampa.Scan (
-- ** Simple, stateful signal processing
sscan, -- :: (b -> a -> b) -> b -> SF a b
sscanPrim, -- :: (c -> a -> Maybe (c, b)) -> c -> b -> SF a b
) where
import FRP.Yampa.InternalCore (SF(..), sfSScan)
------------------------------------------------------------------------------
-- Simple, stateful signal processing
------------------------------------------------------------------------------
-- New sscan primitive. It should be possible to define lots of functions
-- in terms of this one. Eventually a new constructor will be introduced if
-- this works out.
sscan :: (b -> a -> b) -> b -> SF a b
sscan f b_init = sscanPrim f' b_init b_init
where
f' b a = let b' = f b a in Just (b', b')
sscanPrim :: (c -> a -> Maybe (c, b)) -> c -> b -> SF a b
sscanPrim f c_init b_init = SF {sfTF = tf0}
where
tf0 a0 = case f c_init a0 of
Nothing -> (sfSScan f c_init b_init, b_init)
Just (c', b') -> (sfSScan f c' b', b')
-- Vim modeline
-- vim:set tabstop=8 expandtab: