@@ -33,6 +33,8 @@ import qualified Data.Dependent.Map as DMap
33import Data.Dependent.Sum (DSum (..))
33import Data.Dependent.Sum (DSum (..))
34import Data.Functor.Compose
34import Data.Functor.Compose
35import Data.Functor.Constant
35import Data.Functor.Constant
36+import Data.IntMap (IntMap)
37+import qualified Data.IntMap as IntMap
36import qualified Data.Map as Map
38import qualified Data.Map as Map
37import Data.Map.Misc (applyMap)
39import Data.Map.Misc (applyMap)
38import Data.Monoid
40import Data.Monoid
@@ -164,6 +166,7 @@ instance (Reflex t, Adjustable t m, MonadHold t m, SupportsStaticDomBuilder t m)
164 StaticDomBuilderT $ modify $ (:) $ join o
166 StaticDomBuilderT $ modify $ (:) $ join o
165 replaceEnd key
167 replaceEnd key
166 return (fst result0, fmapCheap fst result')
168 return (fst result0, fmapCheap fst result')
169+ traverseIntMapWithKeyWithAdjust = hoistIntMapWithKeyWithAdjust traverseIntMapWithKeyWithAdjust
167 traverseDMapWithKeyWithAdjust = hoistDMapWithKeyWithAdjust traverseDMapWithKeyWithAdjust mapPatchDMap
170 traverseDMapWithKeyWithAdjust = hoistDMapWithKeyWithAdjust traverseDMapWithKeyWithAdjust mapPatchDMap
168 traverseDMapWithKeyWithAdjustWithMove = hoistDMapWithKeyWithAdjust traverseDMapWithKeyWithAdjustWithMove mapPatchDMapWithMove
171 traverseDMapWithKeyWithAdjustWithMove = hoistDMapWithKeyWithAdjust traverseDMapWithKeyWithAdjustWithMove mapPatchDMapWithMove
@@ -177,6 +180,42 @@ replaceStart = do
177replaceEnd :: DomBuilder t m => Text -> m ()
180replaceEnd :: DomBuilder t m => Text -> m ()
178replaceEnd key = void $ commentNode $ def { _commentNodeConfig_initialContents = "replace-end" <> key }
181replaceEnd key = void $ commentNode $ def { _commentNodeConfig_initialContents = "replace-end" <> key }
183+hoistIntMapWithKeyWithAdjust :: forall t m p a b.
188+ , Patch (p (Behavior t Builder))
189+ , PatchTarget (p (Behavior t Builder)) ~ IntMap (Behavior t Builder)
190+ , Ref m ~ IORef, MonadIO m, MonadFix m, PerformEvent t m, MonadReflexCreateTrigger t m, MonadRef m -- TODO remove
192+ => (forall x. (IntMap.Key -> a -> m x)
195+ -> m (IntMap x, Event t (p x))
196+ ) -- ^ The base monad's traversal
197+ -> (IntMap.Key -> a -> StaticDomBuilderT t m b)
200+ -> StaticDomBuilderT t m (IntMap b, Event t (p b))
201+hoistIntMapWithKeyWithAdjust base f im0 im' = do
203+ e <- StaticDomBuilderT ask
204+ (children0, children') <- lift $ base (\k v -> runStaticDomBuilderT (f k v) e) im0 im'
205+ let result0 = IntMap.map fst children0
206+ result' = (fmap . fmap) fst children'
207+ outputs0 :: IntMap (Behavior t Builder)
208+ outputs0 = IntMap.map snd children0
209+ outputs' :: Event t (p (Behavior t Builder))
210+ outputs' = (fmap . fmap) snd children'
211+ outputs <- holdIncremental outputs0 outputs'
212+ StaticDomBuilderT $ modify $ (:) $ pull $ do
213+ os <- sample $ currentIncremental outputs
214+ fmap mconcat $ forM (IntMap.toList os) $ \(_, o) -> do
217+ return (result0, result')
180hoistDMapWithKeyWithAdjust :: forall (k :: * -> *) v v' t m p.
219hoistDMapWithKeyWithAdjust :: forall (k :: * -> *) v v' t m p.
181 ( Adjustable t m
220 ( Adjustable t m
182 , MonadHold t m
221 , MonadHold t m