6 | 6 |
import Language.Robin.Expr
|
7 | 7 |
import Language.Robin.Eval
|
8 | 8 |
import Language.Robin.Reactor
|
|
9 |
import Language.Robin.Facilities
|
9 | 10 |
|
10 | 11 |
|
11 | |
type Facility = Expr -> IO [Expr]
|
12 | |
type WaitForEvents = IO (Either String [Expr])
|
13 | |
|
14 | |
|
15 | |
eventLoop :: Bool -> [Facility] -> WaitForEvents -> [Reactor] -> IO ()
|
|
12 |
eventLoop :: Bool -> [FacilityHandler] -> WaitForEvents -> [Reactor] -> IO ()
|
16 | 13 |
eventLoop showEvents facilities waitForEvents reactors = do
|
17 | 14 |
let (reactors', events') = updateMany reactors (List [(Symbol "init"), (Number 0)])
|
18 | 15 |
e reactors' events'
|
|
30 | 27 |
e reactors (event@(List [eventType, eventPayload]):events) = do
|
31 | 28 |
-- An event on the queue. Allow all facilities and reactors to handle it.
|
32 | 29 |
showEvent event
|
33 | |
newFacilityEvents <- runFacilityHandlers facilities event []
|
|
30 |
newFacilityEvents <- runFacilityHandlers facilities event
|
34 | 31 |
let (reactors', newReactorEvents) = updateMany reactors event
|
35 | 32 |
e reactors' (events ++ newFacilityEvents ++ newReactorEvents)
|
36 | 33 |
|
|
46 | 43 |
Left err -> return ()
|
47 | 44 |
Right events -> e reactors events
|
48 | 45 |
|
49 | |
runFacilityHandlers [] event acc = return acc
|
50 | |
runFacilityHandlers (handler:handlers) event acc = do
|
|
46 |
runFacilityHandlers [] event = return []
|
|
47 |
runFacilityHandlers (handler:handlers) event = do
|
51 | 48 |
newEvents <- handler event
|
52 | |
runFacilityHandlers handlers event (acc ++ newEvents)
|
|
49 |
rest <- runFacilityHandlers handlers event
|
|
50 |
return $ newEvents ++ rest
|
53 | 51 |
|
54 | 52 |
showEvent event = case showEvents of
|
55 | 53 |
True -> hPutStrLn stderr ("*** " ++ show event)
|