@@ -17,7 +17,7 @@ import Control.Lens hiding (has)
1717import Control.Monad
1818import Control.Monad.Fail (MonadFail)
1919import Control.Monad.Fix
20−import Control.Monad.IO.Class (MonadIO, liftIO)
20+import Control.Monad.IO.Class (MonadIO)
2121import Control.Monad.Primitive
2222import Data.Constraint.Extras
2323import Data.Constraint.Extras.TH
@@ -70,6 +70,8 @@ main = do
7070 print os7
7171 os8 <- runApp' testMatchRequestsWithResponses [ Just $ TestRequest_Reverse "abcd" ]
7272 print os8
73+ os9 <- runApp' testMoribundPerformEvent $ map Just [ 1 .. 3 ]
74+ print os9
7375 let ![[Just [10,9,8,7,6,5,4,3,2,1]]] = os1
7476 let ![[Just [1,3,5,7,9]],[Nothing,Nothing],[Just [2,4,6,8,10]],[Just [2,4,6,8,10],Nothing]] = os2
7577 let ![[Nothing, Just [2]]] = os3
@@ -78,6 +80,7 @@ main = do
7880 let ![[Nothing, Nothing]] = os6 -- TODO re-enable this test after issue #233 has been resolved
7981 let !(Just [(-9223372036854775808,"2")]) = M.toList <$> head (head os7)
8082 let !(Just [(-9223372036854775808,"dcba")]) = M.toList <$> head (head os8)
83+ let ![[Nothing,Just "0:1"],[Nothing,Just "1:2"],[Nothing,Just "2:3"]] = os9
8184 return ()
8285
8386unwrapApp :: forall t m a.
@@ -203,6 +206,11 @@ data TestRequest a where
203206 TestRequest_Reverse :: String -> TestRequest String
204207 TestRequest_Increment :: Int -> TestRequest Int
205208
209+instance Show (TestRequest a) where
210+ show = \case
211+ TestRequest_Reverse str -> "reverse " <> str
212+ TestRequest_Increment i -> "increment " <> show i
213+
206214testMatchRequestsWithResponses
207215 :: forall m t req a
208216 . ( MonadFix m
@@ -234,9 +242,23 @@ testMatchRequestsWithResponses pulse = mdo
234242 , \x -> has @Read r $ readMaybe x
235243 )
236244
237−deriveArgDict ''TestRequest
245+-- If a widget is destroyed, and simultaneously it tries to use performEvent, the event does not get performed.
246+-- TODO Determine whether this is actually the behavior we want.
247+testMoribundPerformEvent
248+ :: forall t m
249+ . ( Adjustable t m
250+ , PerformEvent t m
251+ , MonadHold t m
252+ , Reflex t
253+ )
254+ => Event t Int -> m (Event t String)
255+testMoribundPerformEvent pulse = do
256+ (outputInitial, outputReplaced) <- runWithReplace (performPrint 0 pulse) $ ffor pulse $ \i -> performPrint i pulse
257+ switchHold outputInitial outputReplaced
258+ where
259+ performPrint i evt =
260+ performEvent $ ffor evt $ \output ->
261+ return $ show i <> ":" <> show output
238262
239−instance Show (TestRequest a) where
240− show = \case
241− TestRequest_Reverse str -> "reverse " <> str
242− TestRequest_Increment i -> "increment " <> show i
263+
264+deriveArgDict ''TestRequest