@@ -27,6 +27,8 @@ module Reflex.PerformEvent.Base
27import Reflex.Class
27import Reflex.Class
28import Reflex.Host.Class
28import Reflex.Host.Class
29import Reflex.PerformEvent.Class
29import Reflex.PerformEvent.Class
30+import Reflex.Postpone.Base
31+import Reflex.Postpone.Class
30import Reflex.Requester.Base
32import Reflex.Requester.Base
31import Reflex.Requester.Class
33import Reflex.Requester.Class
@@ -49,7 +51,7 @@ newtype FireCommand t m = FireCommand { runFireCommand :: forall a. [DSum (Event
50-- | Provides a basic implementation of 'PerformEvent'. Note that, despite the
52-- | Provides a basic implementation of 'PerformEvent'. Note that, despite the
51-- name, 'PerformEventT' is not an instance of 'MonadTrans'.
53-- 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 }
54deriving instance ReflexHost t => Functor (PerformEventT t m)
56deriving instance ReflexHost t => Functor (PerformEventT t m)
55deriving instance ReflexHost t => Applicative (PerformEventT t m)
57deriving instance ReflexHost t => Applicative (PerformEventT t m)
@@ -71,23 +73,23 @@ instance (ReflexHost t, Ref m ~ Ref IO, PrimMonad (HostFrame t)) => PerformEvent
72instance (ReflexHost t, PrimMonad (HostFrame t)) => MonadAdjust t (PerformEventT t m) where
74instance (ReflexHost t, PrimMonad (HostFrame t)) => MonadAdjust t (PerformEventT t m) where
73 runWithReplace outerA0 outerA' = PerformEventT $ runWithReplaceRequesterTWith f (coerce outerA0) (coerceEvent outerA')
75 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)
75 f a0 a' = do
77 f a0 a' = do
76 result0 <- lift a0
78 result0 <- lift a0
77− result' <- requestingIdentity a'
79+ result' <- requestingIdentity $ fmapCheap runPostponeT a' --TODO: Avoid this fmap
78 return (result0, result')
80 return (result0, result')
79 traverseDMapWithKeyWithAdjust f outerDm0 outerDm' = PerformEventT $ sequenceDMapWithAdjustRequesterTWith (defaultAdjustBase traversePatchDMapWithKey) mapPatchDMap weakenPatchDMapWith patchMapNewElements mergeMapIncremental (\k v -> unPerformEventT $ f k v) (coerce outerDm0) (coerceEvent outerDm')
81 traverseDMapWithKeyWithAdjust f outerDm0 outerDm' = PerformEventT $ sequenceDMapWithAdjustRequesterTWith (defaultAdjustBase traversePatchDMapWithKey) mapPatchDMap weakenPatchDMapWith patchMapNewElements mergeMapIncremental (\k v -> unPerformEventT $ f k v) (coerce outerDm0) (coerceEvent outerDm')
80 traverseDMapWithKeyWithAdjustWithMove f outerDm0 outerDm' = PerformEventT $ sequenceDMapWithAdjustRequesterTWith (defaultAdjustBase traversePatchDMapWithMoveWithKey) mapPatchDMapWithMove weakenPatchDMapWithMoveWith patchMapWithMoveNewElements mergeMapIncrementalWithMove (\k v -> unPerformEventT $ f k v) (coerce outerDm0) (coerceEvent outerDm')
82 traverseDMapWithKeyWithAdjustWithMove f outerDm0 outerDm' = PerformEventT $ sequenceDMapWithAdjustRequesterTWith (defaultAdjustBase traversePatchDMapWithMoveWithKey) mapPatchDMapWithMove weakenPatchDMapWithMoveWith patchMapWithMoveNewElements mergeMapIncrementalWithMove (\k v -> unPerformEventT $ f k v) (coerce outerDm0) (coerceEvent outerDm')
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)
83 => ((forall a. k' a -> v a -> HostFrame t (v2 a)) -> p k' v -> HostFrame t (p k' v2))
85 => ((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))
85 -> DMap k' v
87 -> DMap k' v
86 -> Event t (p k' v)
88 -> 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))
88defaultAdjustBase traversePatchWithKey f' dm0 dm' = do
90defaultAdjustBase traversePatchWithKey f' dm0 dm' = do
89 result0 <- lift $ DMap.traverseWithKey f' dm0
91 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
91 return (result0, result')
93 return (result0, result')
93instance ReflexHost t => MonadReflexCreateTrigger t (PerformEventT t m) where
95instance ReflexHost t => MonadReflexCreateTrigger t (PerformEventT t m) where
@@ -111,7 +113,7 @@ hostPerformEventT :: forall t m a.
111 -> m (a, FireCommand t m)
113 -> m (a, FireCommand t m)
112hostPerformEventT a = do
114hostPerformEventT a = do
113 (response, responseTrigger) <- newEventWithTriggerRef
115 (response, responseTrigger) <- newEventWithTriggerRef
114− (result, eventToPerform) <- runHostFrame $ runRequesterT (unPerformEventT a) response
116+ (result, eventToPerform) <- runHostFrame $ runPostponeT $ runRequesterT (unPerformEventT a) response
115 eventToPerformHandle <- subscribeEvent eventToPerform
117 eventToPerformHandle <- subscribeEvent eventToPerform
116 return $ (,) result $ FireCommand $ \triggers (readPhase :: ReadPhase m a') -> do
118 return $ (,) result $ FireCommand $ \triggers (readPhase :: ReadPhase m a') -> do
117 let go :: [DSum (EventTrigger t) Identity] -> m [a']
119 let go :: [DSum (EventTrigger t) Identity] -> m [a']
@@ -155,3 +157,6 @@ instance (MonadRef (HostFrame t), ReflexHost t) => MonadRef (PerformEventT t m)
155instance (MonadAtomicRef (HostFrame t), ReflexHost t) => MonadAtomicRef (PerformEventT t m) where
157instance (MonadAtomicRef (HostFrame t), ReflexHost t) => MonadAtomicRef (PerformEventT t m) where
156 {-# INLINABLE atomicModifyRef #-}
158 {-# INLINABLE atomicModifyRef #-}
157 atomicModifyRef r = PerformEventT . lift . atomicModifyRef r
159 atomicModifyRef r = PerformEventT . lift . atomicModifyRef r
161+instance (ReflexHost t, MonadIO (HostFrame t)) => MonadPostpone (PerformEventT t m) where
162+ postpone = PerformEventT . postpone . unPerformEventT