Ticket #3964: SF.hs

File SF.hs, 1.2 KB (added by uzytkownik, 3 years ago)

Current minimal file in which problem was detected

Line 
1{-# LANGUAGE Arrows #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE ExistentialQuantification #-}
4{-# LANGUAGE GADTs #-}
5{-# LANGUAGE ViewPatterns #-}
6import Control.Arrow
7import Data.Dynamic
8import Data.Map (Map)
9import Data.Unique
10import System.Mem.Weak
11
12type RunSF a = a Dynamic ()
13data Any = forall a. Any a
14
15data StaticEnviroment a = StaticEnviroment { _runSF :: RunSF a }
16data Enviroment a = Enviroment { _payload :: Dynamic }
17data State a = State { _dSignals :: Map Unique (Weak Any) }
18
19-- | Signal transformer
20data SF a b c =
21   SF (StaticEnviroment a -> a (b, State a, Enviroment a) (c, State a, SF a b c))
22
23data DSignal a b where
24    DSignal :: Typeable c => (a c () -> a () d) -> (c -> b) -> Unique -> DSignal a b
25
26data Event a = Event Unique a deriving Typeable
27
28isOn :: ArrowChoice a => DSignal a c -> SF a b (Maybe c)
29isOn (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