on develop help sign in
Prevent older children from overwriting newer ones in runWithReplace

* Previously, if an older child became ready after a newer one, it would replace the newer one

commitb8e18811b071c43e36e8d9bf8d8e977eb6d1ff48 authorRyan Trinkle <ryan.trinkle@gmail.com> dateMon 27 Mar 2017, 18:48 (10 years ago) parent1e930c2
1 file changed+10−5
src/Reflex/Dom/Builder/Immediate.hs+10−5
src/Reflex/Dom/Builder/Immediate.hs+10−5
@@ -494,7 +494,7 @@ instance (Reflex t, MonadAdjust t m, MonadIO m, MonadHold t m, PerformEvent t m,
494494 before <- textNodeInternal ("" :: Text)
495495 let parentUnreadyChildren = _immediateDomBuilderEnv_unreadyChildren initialEnv
496496 haveEverBeenReady <- liftIO $ newIORef False
497− let myCommitAction = liftIO $ do --TODO: When we change out a child, we need to cancel it's ability to declare us ready
497+ let myCommitAction = liftIO $ do
498498 readIORef haveEverBeenReady >>= \case
499499 True -> return ()
500500 False -> do
@@ -519,13 +519,18 @@ instance (Reflex t, MonadAdjust t m, MonadIO m, MonadHold t m, PerformEvent t m,
519519 0 -> writeIORef haveEverBeenReady True
520520 _ -> modifyIORef' parentUnreadyChildren succ
521521 return result
522− (result0, result') <- lift $ runWithReplace drawInitialChild $ ffor a' $ \child -> do
522+ currentCohort <- liftIO $ newIORef 0
523+ a'' <- zipListWithEvent (,) [1..] a'
524+ (result0, result') <- lift $ runWithReplace drawInitialChild $ ffor a'' $ \(cohortId, child) -> do
523525 Just df <- createDocumentFragment $ _immediateDomBuilderEnv_document initialEnv
524526 unreadyChildren <- liftIO $ newIORef 0
525527 let commitAction = do
526− deleteBetweenExclusive before after
527− insertBefore df after
528− myCommitAction
528+ c <- readIORef currentCohort
529+ when (c < cohortId) $ do -- If a newer cohort has already been committed, just ignore this
530+ deleteBetweenExclusive before after
531+ insertBefore df after
532+ writeIORef currentCohort cohortId
533+ myCommitAction
529534 result <- runImmediateDomBuilderT child $ initialEnv
530535 { _immediateDomBuilderEnv_parent = toNode df
531536 , _immediateDomBuilderEnv_unreadyChildren = unreadyChildren