@@ -1,4 +1,4 @@
1−{-# LANGUAGE FlexibleContexts, GADTs #-}
1+{-# LANGUAGE FlexibleContexts, GADTs, RankNTypes, ScopedTypeVariables #-}
2module Main where
2module Main where
4import Control.Monad
4import Control.Monad
@@ -15,6 +15,7 @@ import Reflex.Host.Class
15import Reflex.PerformEvent.Base
15import Reflex.PerformEvent.Base
16import Reflex.Requester.Base
16import Reflex.Requester.Base
17import Reflex.Requester.Class
17import Reflex.Requester.Class
19import System.Exit (exitFailure, exitSuccess)
20import System.Exit (exitFailure, exitSuccess)
@@ -23,40 +24,24 @@ data RequestInt a where
24main :: IO ()
25main :: IO ()
26− (Just out1, Nothing) <- runApp app1
27+ (Just out1, Nothing) <- runApp $ unwrapApp app1
27 print out1
28 print out1
28− (Just out2, Just (out3, out4)) <- runApp app2
29+ (Just out2, Just (out3, out4)) <- runApp $ unwrapApp app2
29 print out2
30 print out2
30 print out3
31 print out3
31 print out4
32 print out4
32 when (sort out1 /= out1 || map (+1) out2 /= out3 || out3 /= out4) exitFailure
33 when (sort out1 /= out1 || map (+1) out2 /= out3 || out3 /= out4) exitFailure
34−runApp :: (t ~ SpiderTimeline Global, m ~ SpiderHost Global)
35− => (Event t () -> RequesterT t RequestInt Identity (PerformEventT t m) (Maybe (Ref m (Maybe (EventTrigger t ())))))
36− -> IO (Maybe [Int], Maybe ([Int], [Int]))
37−runApp x = runSpiderHost $ do
38− (pulseE, pulseTriggerRef) <- newEventWithTriggerRef
39− ((mactuateRef, e), FireCommand fire) <- hostPerformEventT $ runRequesterT (x pulseE) never
40− hnd <- subscribeEvent (map unwrapRequest . DMap.toList <$> e)
41− out1 <- fireEventRefAndRead pulseTriggerRef () hnd
42− out2 <- fmap join $ forM mactuateRef $ \actuateRef -> do
44− mGetValue <- readEvent hnd
46− Nothing -> return Nothing
47− Just getValue -> fmap Just getValue
48− mactuate <- readRef actuateRef
49− mpulse <- readRef pulseTriggerRef
50− forM ((,) <$> mactuate <*> mpulse) $ \(actuate, pulse) -> do
51− _ <- fire [actuate :=> Identity ()] $ return ()
52− [Just a] <- fire [pulse :=> Identity ()] $ readPhase
53− [Just b, Nothing] <- fire [actuate :=> Identity (), pulse :=> Identity ()] $ readPhase
57unwrapRequest :: DSum tag RequestInt -> Int
35unwrapRequest :: DSum tag RequestInt -> Int
58unwrapRequest (_ :=> RequestInt i) = i
36unwrapRequest (_ :=> RequestInt i) = i
38+unwrapApp :: forall x t a response. (Reflex t, ReflexHost t)
39+ => (x -> RequesterT t RequestInt response (PerformEventT t (SpiderHost Global)) a)
40+ -> x -> PerformEventT t (SpiderHost Global) (a, Event t [Int])
42+ (a, b) <- runRequesterT (x e) never
43+ return (a, fmap (map unwrapRequest . DMap.toList) b)
60app1 :: (Reflex t, Ref m ~ IORef, Requester t m, Response m ~ Identity, Request m ~ RequestInt) => Event t () -> m (Maybe (Ref m (Maybe (EventTrigger t ()))))
45app1 :: (Reflex t, Ref m ~ IORef, Requester t m, Response m ~ Identity, Request m ~ RequestInt) => Event t () -> m (Maybe (Ref m (Maybe (EventTrigger t ()))))
61app1 e = do
46app1 e = do
62 forM_ [1..10] $ \i -> requestingIdentity (RequestInt i <$ e)
47 forM_ [1..10] $ \i -> requestingIdentity (RequestInt i <$ e)