@@ -17,7 +17,7 @@ module Reflex.EventWriter
1717 ( EventWriterT (..)
1818 , runEventWriterT
1919 , EventWriter (..)
20− , runWithReplaceEventWriterTWith
20+ , mapMWithReplaceEventWriterTWith
2121 , sequenceDMapWithAdjustEventWriterTWith
2222 ) where
2323
@@ -78,7 +78,7 @@ instance MonadHold t m => MonadHold t (EventWriterT t w m) where
7878 holdIncremental v0 = lift . holdIncremental v0
7979
8080instance (Reflex t, MonadAdjust t m, MonadHold t m, Semigroup w, Semigroup w) => MonadAdjust t (EventWriterT t w m) where
81− runWithReplace = runWithReplaceEventWriterTWith $ \dm0 dm' -> lift $ runWithReplace dm0 dm'
81+ mapMWithReplace = mapMWithReplaceEventWriterTWith $ \f g dm0 dm' -> lift $ mapMWithReplace f g dm0 dm'
8282 traverseDMapWithKeyWithAdjust = sequenceDMapWithAdjustEventWriterTWith (\f dm0 dm' -> lift $ traverseDMapWithKeyWithAdjust f dm0 dm') mapPatchDMap weakenPatchDMapWith patchMapNewElements mergeMapIncremental
8383 traverseDMapWithKeyWithAdjustWithMove = sequenceDMapWithAdjustEventWriterTWith (\f dm0 dm' -> lift $ traverseDMapWithKeyWithAdjustWithMove f dm0 dm') mapPatchDMapWithMove weakenPatchDMapWithMoveWith patchMapWithMoveNewElements mergeMapIncrementalWithMove
8484
@@ -88,19 +88,27 @@ instance Requester t m => Requester t (EventWriterT t w m) where
8888 withRequesting f = EventWriterT $ withRequesting $ unEventWriterT . f
8989
9090
91−-- | Given a function like 'runWithReplace' for the underlying monad, implement
92−-- 'runWithReplace' for 'EventWriterT'. This is necessary when the underlying
91+-- | Given a function like 'mapMWithReplace' for the underlying monad, implement
92+-- 'mapMWithReplace' for 'EventWriterT'. This is necessary when the underlying
9393-- monad doesn't have a 'MonadAdjust' instance or to override the default
9494-- 'MonadAdjust' behavior.
95−runWithReplaceEventWriterTWith :: forall m t w a b. (Reflex t, MonadHold t m, Semigroup w)
96− => (forall a' b'. m a' -> Event t (m b') -> EventWriterT t w m (a', Event t b'))
97− -> EventWriterT t w m a
98− -> Event t (EventWriterT t w m b)
99− -> EventWriterT t w m (a, Event t b)
100−runWithReplaceEventWriterTWith f a0 a' = do
101− let g :: EventWriterT t w m c -> m (c, Seq (Event t w))
102− g (EventWriterT r) = runStateT r mempty
103− (result0, result') <- f (g a0) $ fmap g a'
95+mapMWithReplaceEventWriterTWith :: forall m t w a a' b b'. (Reflex t, MonadHold t m, Semigroup w)
96+ => (forall aa aa' bb bb'.
97+ (aa -> m bb) ->
98+ (aa' -> m bb') ->
99+ aa ->
100+ Event t aa' ->
101+ EventWriterT t w m (bb, Event t bb')
102+ )
103+ -> (a -> EventWriterT t w m b)
104+ -> (a' -> EventWriterT t w m b')
105+ -> a
106+ -> Event t a'
107+ -> EventWriterT t w m (b, Event t b')
108+mapMWithReplaceEventWriterTWith base f g a0 a' = do
109+ let runInternal :: EventWriterT t w m c -> m (c, Seq (Event t w))
110+ runInternal (EventWriterT r) = runStateT r mempty
111+ (result0, result') <- base (runInternal . f) (runInternal . g) a0 a'
104112 request <- holdDyn (fmapCheap sconcat $ mergeList $ toList $ snd result0) $ fmapCheap (fmapCheap sconcat . mergeList . toList . snd) result'
105113 -- We add these two separately to take advantage of the free merge being done later. The coincidence case must come first so that it has precedence if both fire simultaneously. (Really, we should probably block the 'switch' whenever 'updated' fires, but switchPromptlyDyn has the same issue.)
106114 EventWriterT $ modify $ flip (|>) $ coincidence $ updated request