git @ Cat's Eye Technologies Robin / be587cb
Have each facility's init function return a Facility structure. Chris Pressey 5 years ago
4 changed file(s) with 29 addition(s) and 14 deletion(s). Raw diff Collapse all Expand all
00 module Language.Robin.Facilities.LineTerminal where
11
2 import Control.Concurrent (forkIO, myThreadId)
3 import Control.Concurrent.Chan
24 import qualified Data.Char as Char
35 import System.IO
46
68 import Language.Robin.Facilities
79
810
9 import Control.Concurrent (forkIO, myThreadId)
10 import Control.Concurrent.Chan
11 init :: IO Facility
12 init = do
13 --FIXME causes tests to fail!
14 --chan <- newChan
15 --threadId <- forkIO $ produceEvents chan
16 return Facility{ threadId=Nothing {-Just threadId-}, handler=handleEvent, waiter=waitForEvent }
1117
1218
13 -- sketch
14 init :: IO FacilityHandler
15 init = do
16 chan <- newChan
17 threadId <- forkIO $ produceEvents chan
18 return handleEvent
19
20
21 -- sketch
2219 produceEvents :: Chan Event -> IO ()
2320 produceEvents chan = do
2421 event <- waitForEvent
55 import Language.Robin.Facilities
66
77
8 init :: IO Facility
9 init = do
10 return Facility{ threadId=Nothing, handler=handleEvent, waiter=nullWaiter }
11
12
813 handleEvent :: FacilityHandler
914 handleEvent (List [Symbol "obtain-random-u16", payload]) = do
1015 v <- randomRIO (0, 65535)
00 module Language.Robin.Facilities where
1
2 import Control.Concurrent (ThreadId)
13
24 import Language.Robin.Expr
35
46 type Event = Either String [Expr]
57 type FacilityHandler = Expr -> IO [Expr]
68 type WaitForEvents = IO Event
9
10 data Facility = Facility {
11 threadId :: Maybe ThreadId,
12 handler :: FacilityHandler,
13 waiter :: WaitForEvents
14 }
15
16 nullWaiter :: WaitForEvents
17 nullWaiter = return $ Right []
1111 import Language.Robin.Builtins (robinBuiltins)
1212 import qualified Language.Robin.TopLevel as TopLevel
1313 import Language.Robin.EventLoop (eventLoop)
14 import Language.Robin.Facilities (handler)
1415 import qualified Language.Robin.Facilities.LineTerminal as LineTerminal
1516 import qualified Language.Robin.Facilities.RandomSource as RandomSource
1617
2425 let (args', env', showEvents) = processFlags args (mergeEnvs robinIntrinsics robinBuiltins) False
2526 (_, reactors, results) <- processArgs args' env'
2627 writeResults $ reverse results
27 let waitForEvents = LineTerminal.waitForEvent
28 -- let waitForEvents = waitForLineTerminalEventAsync -- TODO: compose several of these
29 eventLoop showEvents [LineTerminal.handleEvent, RandomSource.handleEvent] waitForEvents reactors
28 lineTerminal <- LineTerminal.init
29 randomSource <- RandomSource.init
30 let waitForEvents = LineTerminal.waitForEvent -- TODO: compose all waiters
31 eventLoop showEvents [handler lineTerminal, handler randomSource] waitForEvents reactors
3032 exitWith ExitSuccess
3133
3234