| 1 | {-# LANGUAGE Arrows #-} |
|---|
| 2 | {-# LANGUAGE DeriveDataTypeable #-} |
|---|
| 3 | {-# LANGUAGE ExistentialQuantification #-} |
|---|
| 4 | {-# LANGUAGE GADTs #-} |
|---|
| 5 | {-# LANGUAGE ViewPatterns #-} |
|---|
| 6 | import Control.Arrow |
|---|
| 7 | import Data.Dynamic |
|---|
| 8 | import Data.Map (Map) |
|---|
| 9 | import Data.Unique |
|---|
| 10 | import System.Mem.Weak |
|---|
| 11 | |
|---|
| 12 | type RunSF a = a Dynamic () |
|---|
| 13 | data Any = forall a. Any a |
|---|
| 14 | |
|---|
| 15 | data StaticEnviroment a = StaticEnviroment { _runSF :: RunSF a } |
|---|
| 16 | data Enviroment a = Enviroment { _payload :: Dynamic } |
|---|
| 17 | data State a = State { _dSignals :: Map Unique (Weak Any) } |
|---|
| 18 | |
|---|
| 19 | -- | Signal transformer |
|---|
| 20 | data SF a b c = |
|---|
| 21 | SF (StaticEnviroment a -> a (b, State a, Enviroment a) (c, State a, SF a b c)) |
|---|
| 22 | |
|---|
| 23 | data DSignal a b where |
|---|
| 24 | DSignal :: Typeable c => (a c () -> a () d) -> (c -> b) -> Unique -> DSignal a b |
|---|
| 25 | |
|---|
| 26 | data Event a = Event Unique a deriving Typeable |
|---|
| 27 | |
|---|
| 28 | isOn :: ArrowChoice a => DSignal a c -> SF a b (Maybe c) |
|---|
| 29 | isOn (DSignal _ f u) = let sf = SF $! \_ -> proc (_, s, e) -> |
|---|
| 30 | case fromDynamic (_payload e) of |
|---|
| 31 | Just (Event ((== u) -> True) v) -> |
|---|
| 32 | returnA -< (Just (f v), s, sf) |
|---|
| 33 | Nothing -> returnA -< (Nothing, s, sf) |
|---|
| 34 | in sf |
|---|