1{-# LANGUAGE FlexibleContexts, GADTs #-}
5import Control.Monad.IO.Class
6import Control.Monad.Ref
7import qualified Data.Dependent.Map as DMap
8import Data.Dependent.Sum
11import Data.Functor.Identity
14import Reflex.Host.Class
15import Reflex.PerformEvent.Base
16import Reflex.Requester.Base
17import Reflex.Requester.Class
19import System.Exit (exitFailure, exitSuccess)
21data RequestInt a where
22 RequestInt :: Int -> RequestInt Int
26 (Just out1, Nothing) <- runApp app1
28 (Just out2, Just (out3, out4)) <- runApp app2
32 when (sort out1 /= out1 || map (+1) out2 /= out3 || out3 /= out4) exitFailure
34runApp :: (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]))
37runApp 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
58unwrapRequest (_ :=> RequestInt i) = i
60app1 :: (Reflex t, Ref m ~ IORef, Requester t m, Response m ~ Identity, Request m ~ RequestInt) => Event t () -> m (Maybe (Ref m (Maybe (EventTrigger t ()))))
62 forM_ [1..10] $ \i -> requestingIdentity (RequestInt i <$ e)
65app2 :: (Reflex t, Ref m ~ IORef, Requester t m, Response m ~ Identity, Request m ~ RequestInt, MonadAdjust t m, MonadReflexCreateTrigger t m, MonadRef m) => Event t () -> m (Maybe (Ref m (Maybe (EventTrigger t ()))))
67 (pulse, pulseTriggerRef) <- newEventWithTriggerRef
68 forM_ [1,3..9] $ \i -> runWithReplace (requestingIdentity (RequestInt i <$ e)) $ ffor pulse $ \_ -> requestingIdentity (RequestInt (i+1) <$ e)
69 return (Just pulseTriggerRef)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list