on develop help sign in
Avoid retaining extra events

* In PerformEventT * In DynamicWriterT

commit28af89feab89c0740bffd4e6bb6d68b40784f6de authorRyan Trinkle <ryan.trinkle@gmail.com> dateMon 20 Jun 2016, 22:03 (10 years ago) parentad74031
2 files changed+30−28
src/Reflex/Dom/DynamicWriter.hs+23−20 src/Reflex/Dom/PerformEvent/Base.hs+7−8
src/Reflex/Dom/DynamicWriter.hs+23−20
@@ -74,11 +74,11 @@ incrementalExtractFunctorDMap = unsafeMapIncremental mapWithFunctorToDMap $ \(Pa
7474mergeIncrementalMap :: (Reflex t, Ord k) => Incremental t PatchMap (Map k (Event t v)) -> Event t (Map k v)
7575mergeIncrementalMap = fmap dmapToMap . mergeIncremental . incrementalExtractFunctorDMap
7676
77−incrementalReplaceableMap :: (Reflex t, Ord k) => Incremental t PatchMap (Map k (Replaceable t v)) -> Incremental t PatchMap (Map k v)
78−incrementalReplaceableMap m =
79− let vals = unsafeBuildIncremental (sample $ currentIncremental m) $ updatedIncremental m <> valChanges
80− valChanges = fmap PatchMap $ mergeIncrementalMap $ mapIncrementalMapValues _replaceable_modify vals
81− in mapIncrementalMapValues _replaceable_value vals
77+holdIncrementalReplaceableMap :: forall t k v m. (MonadFix m, MonadHold t m, Reflex t, Ord k) => Map k (Replaceable t v) -> Event t (PatchMap (Map k (Replaceable t v))) -> m (Incremental t PatchMap (Map k v))
78+holdIncrementalReplaceableMap m0 m' = do
79+ rec vals <- holdIncremental m0 $ m' <> valChanges
80+ let valChanges = fmap PatchMap $ mergeIncrementalMap $ mapIncrementalMapValues _replaceable_modify vals
81+ return $ mapIncrementalMapValues _replaceable_value vals
8282
8383mergeDynIncremental :: (Reflex t, Ord k) => Incremental t PatchMap (Map k (Dynamic t v)) -> Incremental t PatchMap (Map k v)
8484mergeDynIncremental a = unsafeBuildIncremental (mapM (sample . current) =<< sample (currentIncremental a)) $ addedAndRemovedValues <> changedValues
@@ -114,14 +114,25 @@ instance MonadReflexCreateTrigger t m => MonadReflexCreateTrigger t (DynamicWrit
114114runDynamicWriterTInternal :: DynamicWriterT t w m a -> m (a, DynamicWriterAccumulator t w)
115115runDynamicWriterTInternal (DynamicWriterT a) = runStateT a []
116116
117−mconcatIncrementalReplaceableDynMap :: (Reflex t, Monoid v, Ord k) => Incremental t PatchMap (Map k (Replaceable t (Dynamic t v))) -> Dynamic t v
118−mconcatIncrementalReplaceableDynMap = fmap (mconcat . Map.elems) . incrementalToDynamic . mergeDynIncremental . incrementalReplaceableMap
119−
120−runDynamicWriterT :: (Reflex t, MonadHold t m, Monoid w) => DynamicWriterT t w m a -> m (a, Dynamic t w)
117+mconcatIncrementalReplaceableDynMap :: forall m t k v. (MonadFix m, MonadHold t m, Reflex t, Monoid v, Ord k) => Map k (Replaceable t (Dynamic t v)) -> Event t (PatchMap (Map k (Replaceable t (Dynamic t v)))) -> Event t () -> m (Replaceable t (Dynamic t v))
118+mconcatIncrementalReplaceableDynMap m0 m' additionsCeased = do
119+ rec vals <- holdIncremental m0 $ m' <> valChanges
120+ let valChanges = fmap PatchMap $ mergeIncrementalMap $ mapIncrementalMapValues _replaceable_modify vals
121+ let i = mapIncrementalMapValues _replaceable_value vals
122+ noMoreAdditions <- holdDyn False $ True <$ additionsCeased
123+ let replaceSelf nma x = do
124+ guard nma
125+ case Map.toList x of
126+ [] -> return Nothing -- Delete self
127+ [(_, n)] -> return $ Just n --TODO: What if this one is also replacing itself simultaneously?
128+ _ -> mzero
129+ result = fmap (mconcat . Map.elems) $ incrementalToDynamic $ mergeDynIncremental i
130+ return $ Replaceable result $ fmapMaybe id $ updated $ zipDynWith replaceSelf noMoreAdditions $ incrementalToDynamic vals
131+
132+runDynamicWriterT :: (MonadFix m, Reflex t, MonadHold t m, Monoid w) => DynamicWriterT t w m a -> m (a, Dynamic t w)
121133runDynamicWriterT (DynamicWriterT a) = do
122134 (result, ws) <- runStateT a []
123− i <- holdIncremental (Map.fromList $ zip [1 :: Int ..] $ reverse ws) never
124− let w = mconcatIncrementalReplaceableDynMap i
135+ Replaceable w _ <- mconcatIncrementalReplaceableDynMap (Map.fromList $ zip [1 :: Int ..] $ reverse ws) never never
125136 return (result, w)
126137
127138class Monad m => MonadDynamicWriter t w m | m -> t w where
@@ -177,15 +188,7 @@ instance (DomBuilder t m, Monoid w, MonadHold t m, MonadFix m) => DomBuilder t (
177188 let (myNextId, numbered) = mapAccumL (\n v -> (succ n, (n, Just v))) myFirstId cs
178189 return (myNextId, PatchMap $ Map.fromList numbered)
179190 newNextId = fst <$> numberedNewChildren
180− replaceableMap <- holdIncremental Map.empty $ snd <$> numberedNewChildren
181− noMoreAdditions <- holdDyn False $ True <$ additionsCeased
182− let replaceSelf nma i = do
183− guard nma
184− case Map.toList i of
185− [] -> return Nothing -- Delete self
186− [(_, n)] -> return $ Just n
187− _ -> mzero
188− return $ Replaceable (mconcatIncrementalReplaceableDynMap replaceableMap) $ fmapMaybe id $ updated $ zipDynWith replaceSelf noMoreAdditions $ incrementalToDynamic replaceableMap
191+ mconcatIncrementalReplaceableDynMap Map.empty (snd <$> numberedNewChildren) additionsCeased
189192 rec children <- lift $ manageChildren childOutputs $ cfg ^. deleteSelf
190193 p <- DynamicWriterT $ do
191194 modify (children:)
src/Reflex/Dom/PerformEvent/Base.hs+7−8
@@ -55,13 +55,11 @@ instance (ReflexHost t, Ref m ~ Ref IO, MonadRef (HostFrame t), Ref (HostFrame t
5555 return [EventTriggerRef reResultTrigger :=> Identity result]
5656 return eResult
5757
58−instance (ReflexHost t, Monad (HostFrame t), Ref (HostFrame t) ~ Ref IO, Ref m ~ Ref IO) => Deletable t (PerformEventT t m) where
58+instance (ReflexHost t, Monad (HostFrame t), MonadRef (HostFrame t), Ref (HostFrame t) ~ Ref IO, Ref m ~ Ref IO) => Deletable t (PerformEventT t m) where
5959 {-# INLINABLE deletable #-}
6060 deletable d a = PerformEventT $ do
61− (result, reverseEventsToPerform) <- lift $ runStateT (unPerformEventT a) []
62− let (numberedEvents, _) = numberWith (\n e -> Const2 n :=> e) (reverse reverseEventsToPerform) (1 :: Word64)
63− eventToPerform <- lift $ mergePerformEventsAndAdd (DMap.fromList numberedEvents) never
64− modify (align eventToPerform d :)
61+ (result, eventToPerform) <- lift $ runPerformEventT a
62+ modify (align (fmap (PerformEventT . lift) eventToPerform) d :)
6563 return result
6664
6765instance ReflexHost t => MonadReflexCreateTrigger t (PerformEventT t m) where
@@ -81,7 +79,7 @@ mergePerformEventsAndAdd :: forall t m. ReflexHost t
8179 -> HostFrame t (Event t (PerformEventT t m [DSum (EventTriggerRef t m) Identity]))
8280mergePerformEventsAndAdd initial eAddNew = do
8381 rec events :: Incremental t PatchDMap (DMap (Const2 Word64 (These (PerformEventT t m [DSum (EventTriggerRef t m) Identity]) ())) (Event t))
84− <- holdIncremental initial $ eAddNew <> eDelete
82+ <- holdIncremental initial $ eAddNew <> eDelete --TODO: Eliminate empty firings
8583 let event = mergeWith DMap.union [mergeIncremental events, coincidence (fmap (\(PatchDMap m) -> merge $ DMap.mapMaybeWithKey (const getCompose) m) eAddNew)]
8684 eventToPerform :: Event t (PerformEventT t m [DSum (EventTriggerRef t m) Identity])
8785 eventToPerform = ffor event $
@@ -109,8 +107,9 @@ runPerformEventT (PerformEventT a) = do
109107 (followups, reverseNewEventsToPerform) <- runStateT r []
110108 oldN <- readRef nextNumberRef
111109 let (numberedNewEvents, newN) = numberWith (\n e -> Const2 n :=> Compose (Just e)) (reverse reverseNewEventsToPerform) oldN
112− writeRef nextNumberRef newN
113− return $ (EventTriggerRef reAddNewTrigger :=> Identity (PatchDMap (DMap.fromList numberedNewEvents))) : followups --TODO: Don't fire eAddNew when the list is empty
110+ if newN == oldN then return followups else do
111+ writeRef nextNumberRef newN
112+ return $ (EventTriggerRef reAddNewTrigger :=> Identity (PatchDMap (DMap.fromList numberedNewEvents))) : followups
114113 eventToPerform <- mergePerformEventsAndAdd (DMap.fromList numberedEvents) eAddNew
115114 return (result, runResult <$> eventToPerform)
116115