@@ -27,6 +27,8 @@ module Reflex.PerformEvent.Base
2727import Reflex.Class
2828import Reflex.Host.Class
2929import Reflex.PerformEvent.Class
30+import Reflex.Postpone.Base
31+import Reflex.Postpone.Class
3032import Reflex.Requester.Base
3133import Reflex.Requester.Class
3234
@@ -49,7 +51,7 @@ newtype FireCommand t m = FireCommand { runFireCommand :: forall a. [DSum (Event
4951
5052-- | Provides a basic implementation of 'PerformEvent'. Note that, despite the
5153-- name, 'PerformEventT' is not an instance of 'MonadTrans'.
52−newtype PerformEventT t m a = PerformEventT { unPerformEventT :: RequesterT t (HostFrame t) Identity (HostFrame t) a }
54+newtype PerformEventT t m a = PerformEventT { unPerformEventT :: RequesterT t (HostFrame t) Identity (PostponeT (HostFrame t)) a }
5355
5456deriving instance ReflexHost t => Functor (PerformEventT t m)
5557deriving instance ReflexHost t => Applicative (PerformEventT t m)
@@ -71,23 +73,23 @@ instance (ReflexHost t, Ref m ~ Ref IO, PrimMonad (HostFrame t)) => PerformEvent
7173
7274instance (ReflexHost t, PrimMonad (HostFrame t)) => MonadAdjust t (PerformEventT t m) where
7375 runWithReplace outerA0 outerA' = PerformEventT $ runWithReplaceRequesterTWith f (coerce outerA0) (coerceEvent outerA')
74− where f :: HostFrame t a -> Event t (HostFrame t b) -> RequesterT t (HostFrame t) Identity (HostFrame t) (a, Event t b)
76+ where f :: PostponeT (HostFrame t) a -> Event t (PostponeT (HostFrame t) b) -> RequesterT t (HostFrame t) Identity (PostponeT (HostFrame t)) (a, Event t b)
7577 f a0 a' = do
7678 result0 <- lift a0
77− result' <- requestingIdentity a'
79+ result' <- requestingIdentity $ fmapCheap runPostponeT a' --TODO: Avoid this fmap
7880 return (result0, result')
7981 traverseDMapWithKeyWithAdjust f outerDm0 outerDm' = PerformEventT $ sequenceDMapWithAdjustRequesterTWith (defaultAdjustBase traversePatchDMapWithKey) mapPatchDMap weakenPatchDMapWith patchMapNewElements mergeMapIncremental (\k v -> unPerformEventT $ f k v) (coerce outerDm0) (coerceEvent outerDm')
8082 traverseDMapWithKeyWithAdjustWithMove f outerDm0 outerDm' = PerformEventT $ sequenceDMapWithAdjustRequesterTWith (defaultAdjustBase traversePatchDMapWithMoveWithKey) mapPatchDMapWithMove weakenPatchDMapWithMoveWith patchMapWithMoveNewElements mergeMapIncrementalWithMove (\k v -> unPerformEventT $ f k v) (coerce outerDm0) (coerceEvent outerDm')
8183
82−defaultAdjustBase :: forall t v v2 k' p. (Monad (HostFrame t), PrimMonad (HostFrame t), Reflex t)
84+defaultAdjustBase :: forall t v v2 k' p. (PrimMonad (HostFrame t), Reflex t)
8385 => ((forall a. k' a -> v a -> HostFrame t (v2 a)) -> p k' v -> HostFrame t (p k' v2))
84− -> (forall a. k' a -> v a -> HostFrame t (v2 a))
86+ -> (forall a. k' a -> v a -> PostponeT (HostFrame t) (v2 a))
8587 -> DMap k' v
8688 -> Event t (p k' v)
87− -> RequesterT t (HostFrame t) Identity (HostFrame t) (DMap k' v2, Event t (p k' v2))
89+ -> RequesterT t (HostFrame t) Identity (PostponeT (HostFrame t)) (DMap k' v2, Event t (p k' v2))
8890defaultAdjustBase traversePatchWithKey f' dm0 dm' = do
8991 result0 <- lift $ DMap.traverseWithKey f' dm0
90− result' <- requestingIdentity $ ffor dm' $ traversePatchWithKey f'
92+ result' <- requestingIdentity $ ffor dm' $ traversePatchWithKey $ \k v -> runPostponeT $ f' k v
9193 return (result0, result')
9294
9395instance ReflexHost t => MonadReflexCreateTrigger t (PerformEventT t m) where
@@ -111,7 +113,7 @@ hostPerformEventT :: forall t m a.
111113 -> m (a, FireCommand t m)
112114hostPerformEventT a = do
113115 (response, responseTrigger) <- newEventWithTriggerRef
114− (result, eventToPerform) <- runHostFrame $ runRequesterT (unPerformEventT a) response
116+ (result, eventToPerform) <- runHostFrame $ runPostponeT $ runRequesterT (unPerformEventT a) response
115117 eventToPerformHandle <- subscribeEvent eventToPerform
116118 return $ (,) result $ FireCommand $ \triggers (readPhase :: ReadPhase m a') -> do
117119 let go :: [DSum (EventTrigger t) Identity] -> m [a']
@@ -155,3 +157,6 @@ instance (MonadRef (HostFrame t), ReflexHost t) => MonadRef (PerformEventT t m)
155157instance (MonadAtomicRef (HostFrame t), ReflexHost t) => MonadAtomicRef (PerformEventT t m) where
156158 {-# INLINABLE atomicModifyRef #-}
157159 atomicModifyRef r = PerformEventT . lift . atomicModifyRef r
160+
161+instance (ReflexHost t, MonadIO (HostFrame t)) => MonadPostpone (PerformEventT t m) where
162+ postpone = PerformEventT . postpone . unPerformEventT