6 | import public Web.MVC.Cmd
7 | import public Web.MVC.View
8 | import public Text.HTML
15 | -> (ctrl : e -> s -> (s, Cmd e))
16 | -> (onErr : JSErr -> IO ())
20 | runController ctrl onErr initEv initST = Prelude.do
21 | state <- newIORef initST
22 | flag <- newIORef False
23 | queue <- newIORef $
Queue.empty {a = e}
25 | let covering handle : e -> IO ()
26 | handle ev = Prelude.do
30 | False <- readIORef flag | True => modifyIORef queue (`enqueue` ev)
34 | writeIORef flag True
37 | stOld <- readIORef state
40 | let (stNew, cmd) := ctrl ev stOld
43 | writeIORef state stNew
48 | ei <- runEitherT (run cmd (liftIO . handle))
51 | Left err => onErr err
56 | writeIORef flag False
59 | Just (ev2,q) <- dequeue <$> readIORef queue | Nothing => pure ()
68 | -> (update : e -> s -> s)
69 | -> (display : e -> s -> Cmd e)
70 | -> (onErr : JSErr -> IO ())
74 | runMVC upd disp onErr =
75 | runController (\ev,st => let st2 := upd ev st in (st2, disp ev st2)) onErr