@@ -136,6 +136,20 @@ deleteBetweenInclusive s e = do
136136 _ <- removeChild currentParent $ Just e
137137 return ()
138138
139+-- | s and e must both be children of the same node and s must precede e
140+deleteBetweenExclusive :: (MonadIO m, IsNode start, IsNode end) => start -> end -> m ()
141+deleteBetweenExclusive s e = do
142+ mCurrentParent <- getParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
143+ case mCurrentParent of
144+ Nothing -> return () --TODO: Is this the right behavior?
145+ Just currentParent -> do
146+ let go = do
147+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
148+ when (toNode s /= toNode x) $ do
149+ _ <- removeChild currentParent $ Just x
150+ go
151+ go
152+
139153-- | s and e must both be children of the same node and s must precede e; s and all nodes between s and e will be removed, but e will not be removed
140154{-# INLINABLE deleteUpTo #-}
141155deleteUpTo :: (MonadIO m, IsNode start, IsNode end) => start -> end -> m ()
@@ -381,6 +395,24 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
381395 wrapRawElement = wrap
382396
383397instance (Reflex t, MonadAdjust t m, MonadIO m, MonadHold t m, PerformEvent t m, MonadIO (Performable m)) => MonadAdjust t (ImmediateDomBuilderT t m) where
398+ runWithReplace a0 a' = do
399+ initialEnv <- ImmediateDomBuilderT ask
400+ before <- textNodeInternal ("" :: Text)
401+ -- We draw 'after' in this roundabout way to avoid using MonadFix
402+ Just after <- createTextNode (_immediateDomBuilderEnv_document initialEnv) ("" :: Text)
403+ let drawInitialChild = do
404+ result <- a0
405+ append after
406+ return result
407+ (result0, result') <- lift $ runWithReplace (runImmediateDomBuilderT drawInitialChild initialEnv) $ ffor a' $ \child -> do
408+ Just df <- createDocumentFragment $ _immediateDomBuilderEnv_document initialEnv
409+ result <- runImmediateDomBuilderT child $ initialEnv
410+ { _immediateDomBuilderEnv_parent = toNode df
411+ }
412+ deleteBetweenExclusive before after
413+ insertBefore df after
414+ return result
415+ return (result0, result')
384416 sequenceDMapWithAdjust (dm0 :: DMap k (ImmediateDomBuilderT t m)) dm' = do
385417 initialEnv <- ImmediateDomBuilderT ask
386418 let drawChildInitial :: ImmediateDomBuilderT t m a -> m (DOM.DocumentFragment, DOM.Text, a)