on develop help sign in
Prevent older children from overwriting newer ones in runWithReplace
b8e1881Ryan Trinkle
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,
494 before <- textNodeInternal ("" :: Text)
494 before <- textNodeInternal ("" :: Text)
495 let parentUnreadyChildren = _immediateDomBuilderEnv_unreadyChildren initialEnv
495 let parentUnreadyChildren = _immediateDomBuilderEnv_unreadyChildren initialEnv
496 haveEverBeenReady <- liftIO $ newIORef False
496 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
498 readIORef haveEverBeenReady >>= \case
498 readIORef haveEverBeenReady >>= \case
499 True -> return ()
499 True -> return ()
500 False -> do
500 False -> do
@@ -519,13 +519,18 @@ instance (Reflex t, MonadAdjust t m, MonadIO m, MonadHold t m, PerformEvent t m,
519 0 -> writeIORef haveEverBeenReady True
519 0 -> writeIORef haveEverBeenReady True
520 _ -> modifyIORef' parentUnreadyChildren succ
520 _ -> modifyIORef' parentUnreadyChildren succ
521 return result
521 return result
522+ currentCohort <- liftIO $ newIORef 0
523+ a'' <- zipListWithEvent (,) [1..] a'
522− (result0, result') <- lift $ runWithReplace drawInitialChild $ ffor a' $ \child -> do
524+ (result0, result') <- lift $ runWithReplace drawInitialChild $ ffor a'' $ \(cohortId, child) -> do
523 Just df <- createDocumentFragment $ _immediateDomBuilderEnv_document initialEnv
525 Just df <- createDocumentFragment $ _immediateDomBuilderEnv_document initialEnv
524 unreadyChildren <- liftIO $ newIORef 0
526 unreadyChildren <- liftIO $ newIORef 0
525 let commitAction = do
527 let commitAction = do
528+ c <- readIORef currentCohort
529+ when (c < cohortId) $ do -- If a newer cohort has already been committed, just ignore this
526− deleteBetweenExclusive before after
530+ deleteBetweenExclusive before after
527− insertBefore df after
531+ insertBefore df after
532+ writeIORef currentCohort cohortId
528− myCommitAction
533+ myCommitAction
529 result <- runImmediateDomBuilderT child $ initialEnv
534 result <- runImmediateDomBuilderT child $ initialEnv
530 { _immediateDomBuilderEnv_parent = toNode df
535 { _immediateDomBuilderEnv_parent = toNode df
531 , _immediateDomBuilderEnv_unreadyChildren = unreadyChildren
536 , _immediateDomBuilderEnv_unreadyChildren = unreadyChildren