@@ -1,22 +1,35 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2{-# LANGUAGE BangPatterns #-}
2{-# LANGUAGE BangPatterns #-}
3{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE GADTs #-}
5{-# LANGUAGE GADTs #-}
6+{-# LANGUAGE LambdaCase #-}
7+{-# LANGUAGE MultiParamTypeClasses #-}
5{-# LANGUAGE RankNTypes #-}
8{-# LANGUAGE RankNTypes #-}
6{-# LANGUAGE RecursiveDo #-}
9{-# LANGUAGE RecursiveDo #-}
7{-# LANGUAGE ScopedTypeVariables #-}
10{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE TemplateHaskell #-}
12+{-# LANGUAGE TypeApplications #-}
13+{-# LANGUAGE TypeFamilies #-}
8module Main where
14module Main where
10−import Control.Lens
16+import Control.Lens hiding (has)
11import Control.Monad
17import Control.Monad
18+import Control.Monad.Fail (MonadFail)
12import Control.Monad.Fix
19import Control.Monad.Fix
20+import Control.Monad.IO.Class (MonadIO, liftIO)
13import Control.Monad.Primitive
21import Control.Monad.Primitive
22+import Data.Constraint.Extras
23+import Data.Constraint.Extras.TH
24+import Data.Constraint.Forall
14import qualified Data.Dependent.Map as DMap
25import qualified Data.Dependent.Map as DMap
15import Data.Dependent.Sum
26import Data.Dependent.Sum
16import Data.Functor.Misc
27import Data.Functor.Misc
17import qualified Data.Map as M
29import qualified Data.Map as M
18import Data.These
30import Data.These
19import Data.List.NonEmpty.Deferred
31import Data.List.NonEmpty.Deferred
32+import Text.Read (readMaybe)
21#if defined(MIN_VERSION_these_lens) || (MIN_VERSION_these(0,8,0) && !MIN_VERSION_these(0,9,0))
34#if defined(MIN_VERSION_these_lens) || (MIN_VERSION_these(0,8,0) && !MIN_VERSION_these(0,9,0))
22import Data.These.Lens
35import Data.These.Lens
@@ -27,6 +40,8 @@ import Reflex.Requester.Base
27import Reflex.Requester.Class
40import Reflex.Requester.Class
28import Test.Run
41import Test.Run
43+import Debug.Trace hiding (traceEvent)
30data RequestInt a where
45data RequestInt a where
31 RequestInt :: Int -> RequestInt Int
46 RequestInt :: Int -> RequestInt Int
@@ -35,7 +50,7 @@ main = do
35 os1 <- runApp' (unwrapApp testOrdering) $
50 os1 <- runApp' (unwrapApp testOrdering) $
38− print os1
53+ --print os1
39 os2 <- runApp' (unwrapApp testSimultaneous) $ map Just $
54 os2 <- runApp' (unwrapApp testSimultaneous) $ map Just $
@@ -51,12 +66,18 @@ main = do
52 os6 <- runApp' (unwrapApp delayedPulse) [Just ()]
67 os6 <- runApp' (unwrapApp delayedPulse) [Just ()]
69+ os7 <- runApp' testMatchRequestsWithResponses $ map Just [ TestRequest_Increment 1, TestRequest_Increment 2 ]
71+ os8 <- runApp' testMatchRequestsWithResponses [ Just $ TestRequest_Reverse "abcd" ]
54 let ![[Just [10,9,8,7,6,5,4,3,2,1]]] = os1
73 let ![[Just [10,9,8,7,6,5,4,3,2,1]]] = os1
55 let ![[Just [1,3,5,7,9]],[Nothing,Nothing],[Just [2,4,6,8,10]],[Just [2,4,6,8,10],Nothing]] = os2
74 let ![[Just [1,3,5,7,9]],[Nothing,Nothing],[Just [2,4,6,8,10]],[Just [2,4,6,8,10],Nothing]] = os2
56 let ![[Nothing, Just [2]]] = os3
75 let ![[Nothing, Just [2]]] = os3
57 let ![[Nothing, Just [2]]] = os4
76 let ![[Nothing, Just [2]]] = os4
58 let ![[Nothing, Just [1, 2]]] = os5
77 let ![[Nothing, Just [1, 2]]] = os5
59 let ![[Nothing, Nothing]] = os6 -- TODO re-enable this test after issue #233 has been resolved
78 let ![[Nothing, Nothing]] = os6 -- TODO re-enable this test after issue #233 has been resolved
79+ let !(Just [(-9223372036854775808,"2")]) = M.toList <$> head (head os7)
80+ let !(Just [(-9223372036854775808,"dcba")]) = M.toList <$> head (head os8)
62unwrapApp :: forall t m a.
83unwrapApp :: forall t m a.
@@ -177,3 +198,45 @@ delayedPulse pulse = void $ flip runWithReplace (pure () <$ pulse) $ do
177 -- This has the effect of delaying pulse' from pulse
198 -- This has the effect of delaying pulse' from pulse
178 (_, pulse') <- runWithReplace (pure ()) $ pure (RequestInt 1) <$ pulse
199 (_, pulse') <- runWithReplace (pure ()) $ pure (RequestInt 1) <$ pulse
179 requestingIdentity pulse'
200 requestingIdentity pulse'
202+data TestRequest a where
203+ TestRequest_Reverse :: String -> TestRequest String
204+ TestRequest_Increment :: Int -> TestRequest Int
206+testMatchRequestsWithResponses
212+ , MonadIO (Performable m)
220+ => Event t (req a) -> m (Event t (Map Int String))
221+testMatchRequestsWithResponses pulse = mdo
222+ (_, requests) <- runRequesterT (requesting pulse) responses
223+ let rawResponseMap = M.map (\v ->
225+ ["reverse", str] -> reverse str
226+ ["increment", i] -> show $ succ $ (read i :: Int)
228+ (rawRequestMap, responses) <- matchResponsesWithRequests reqEncoder requests (head . M.toList <$> rawResponseMap)
231+ reqEncoder :: forall a. req a -> (String, String -> Maybe a)
233+ ( whichever @Show @req @a $ show r
234+ , \x -> has @Read r $ readMaybe x
237+deriveArgDict ''TestRequest
239+instance Show (TestRequest a) where
241+ TestRequest_Reverse str -> "reverse " <> str
242+ TestRequest_Increment i -> "increment " <> show i