{-# LANGUAGE Arrows #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
module FRP.Rhine.Type where
import Data.MonadicStreamFunction
import FRP.Rhine.Reactimation.ClockErasure
import FRP.Rhine.Clock
import FRP.Rhine.Clock.Proxy
import FRP.Rhine.SN
data Rhine m cl a b = Rhine
{ sn :: SN m cl a b
, clock :: cl
}
instance GetClockProxy cl => ToClockProxy (Rhine m cl a b) where
type Cl (Rhine m cl a b) = cl
eraseClock
:: (Monad m, Clock m cl, GetClockProxy cl)
=> Rhine m cl a b
-> m (MSF m a (Maybe b))
eraseClock Rhine {..} = do
(runningClock, initTime) <- initClock clock
return $ proc a -> do
(time, tag) <- runningClock -< ()
eraseClockSN initTime sn -< (time, tag, a <$ inTag (toClockProxy sn) tag)