@@ -1,4 +1,4 @@
1−{-# LANGUAGE FlexibleContexts, GADTs #-}
1+{-# LANGUAGE FlexibleContexts, GADTs, RankNTypes, ScopedTypeVariables #-}
22module Main where
33
44import Control.Monad
@@ -15,6 +15,7 @@ import Reflex.Host.Class
1515import Reflex.PerformEvent.Base
1616import Reflex.Requester.Base
1717import Reflex.Requester.Class
18+import Test.Run
1819
1920import System.Exit (exitFailure, exitSuccess)
2021
@@ -23,40 +24,24 @@ data RequestInt a where
2324
2425main :: IO ()
2526main = do
26− (Just out1, Nothing) <- runApp app1
27+ (Just out1, Nothing) <- runApp $ unwrapApp app1
2728 print out1
28− (Just out2, Just (out3, out4)) <- runApp app2
29+ (Just out2, Just (out3, out4)) <- runApp $ unwrapApp app2
2930 print out2
3031 print out3
3132 print out4
3233 when (sort out1 /= out1 || map (+1) out2 /= out3 || out3 /= out4) exitFailure
3334
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
43− let readPhase = do
44− mGetValue <- readEvent hnd
45− case mGetValue of
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
54− return (a,b)
55− return (out1, out2)
56−
5735unwrapRequest :: DSum tag RequestInt -> Int
5836unwrapRequest (_ :=> RequestInt i) = i
5937
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])
41+unwrapApp x e = do
42+ (a, b) <- runRequesterT (x e) never
43+ return (a, fmap (map unwrapRequest . DMap.toList) b)
44+
6045app1 :: (Reflex t, Ref m ~ IORef, Requester t m, Response m ~ Identity, Request m ~ RequestInt) => Event t () -> m (Maybe (Ref m (Maybe (EventTrigger t ()))))
6146app1 e = do
6247 forM_ [1..10] $ \i -> requestingIdentity (RequestInt i <$ e)