@@ -30,7 +30,10 @@ import Control.Monad.State.Strict
3030import Data.Align
3131import Data.Dependent.Map (DMap)
3232import qualified Data.Dependent.Map as DMap
33+import Data.FastMutableIntMap
3334import Data.Functor.Misc
35+import Data.IntMap (IntMap)
36+import qualified Data.IntMap as IntMap
3437import Data.Map (Map)
3538import qualified Data.Map as Map
3639import Data.Semigroup
@@ -55,6 +58,11 @@ mergeDynIncremental a = unsafeBuildIncremental (mapM (sample . current) =<< samp
5558 where changedValues = fmap (PatchMap . fmap Just) $ mergeMapIncremental $ mapIncrementalMapValues updated a
5659 addedAndRemovedValues = flip pushAlways (updatedIncremental a) $ \(PatchMap m) -> PatchMap <$> mapM (mapM (sample . current)) m
5760
61+mergeIntMapDynIncremental :: Reflex t => Incremental t (PatchIntMap (Dynamic t v)) -> Incremental t (PatchIntMap v)
62+mergeIntMapDynIncremental a = unsafeBuildIncremental (mapM (sample . current) =<< sample (currentIncremental a)) $ addedAndRemovedValues <> changedValues
63+ where changedValues = fmap (PatchIntMap . fmap Just) $ mergeIntMapIncremental $ mapIncrementalMapValues updated a
64+ addedAndRemovedValues = flip pushAlways (updatedIncremental a) $ \(PatchIntMap m) -> PatchIntMap <$> mapM (mapM (sample . current)) m
65+
5866mergeDynIncrementalWithMove :: forall t k v. (Reflex t, Ord k) => Incremental t (PatchMapWithMove k (Dynamic t v)) -> Incremental t (PatchMapWithMove k v)
5967mergeDynIncrementalWithMove a = unsafeBuildIncremental (mapM (sample . current) =<< sample (currentIncremental a)) $ alignWith f addedAndRemovedValues changedValues
6068 where changedValues = mergeMapIncrementalWithMove $ mapIncrementalMapValues updated a
@@ -142,6 +150,7 @@ instance (Adjustable t m, MonadFix m, Monoid w, MonadHold t m, Reflex t) => Adju
142150 (result0, result') <- lift $ runWithReplace (runDynamicWriterT a0) $ runDynamicWriterT <$> a'
143151 tellDyn . join =<< holdDyn (snd result0) (snd <$> result')
144152 return (fst result0, fst <$> result')
153+ traverseIntMapWithKeyWithAdjust = traverseIntMapWithKeyWithAdjustImpl traverseIntMapWithKeyWithAdjust mergeIntMapDynIncremental
145154 traverseDMapWithKeyWithAdjust = traverseDMapWithKeyWithAdjustImpl traverseDMapWithKeyWithAdjust mapPatchDMap weakenPatchDMapWith mergeDynIncremental
146155 traverseDMapWithKeyWithAdjustWithMove = traverseDMapWithKeyWithAdjustImpl traverseDMapWithKeyWithAdjustWithMove mapPatchDMapWithMove weakenPatchDMapWithMoveWith mergeDynIncrementalWithMove
147156
@@ -172,6 +181,29 @@ traverseDMapWithKeyWithAdjustImpl base mapPatch weakenPatchWith mergeMyDynIncrem
172181 tellDyn $ fmap (mconcat . Map.elems) $ incrementalToDynamic $ mergeMyDynIncremental i
173182 return (liftedResult0, liftedResult')
174183
184+traverseIntMapWithKeyWithAdjustImpl :: forall t w v' p p' v m. (PatchTarget (p' (Dynamic t w)) ~ IntMap (Dynamic t w), PatchTarget (p' w) ~ IntMap w, Patch (p' w), Patch (p' (Dynamic t w)), MonadFix m, Monoid w, Reflex t, MonadHold t m, Functor p, p ~ p')
185+ => ( (IntMap.Key -> v -> m ((v', Dynamic t w)))
186+ -> IntMap v
187+ -> Event t (p v)
188+ -> m (IntMap (v', Dynamic t w), Event t (p (v', Dynamic t w)))
189+ )
190+ -> (Incremental t (p' (Dynamic t w)) -> Incremental t (p' w))
191+ -> (IntMap.Key -> v -> DynamicWriterT t w m v')
192+ -> IntMap v
193+ -> Event t (p v)
194+ -> DynamicWriterT t w m (IntMap v', Event t (p v'))
195+traverseIntMapWithKeyWithAdjustImpl base mergeMyDynIncremental f (dm0 :: IntMap v) dm' = do
196+ (result0, result') <- lift $ base (\k v -> runDynamicWriterT $ f k v) dm0 dm'
197+ let liftedResult0 = fmap fst result0
198+ liftedResult' = fmap (fmap fst) result'
199+ liftedWritten0 :: IntMap (Dynamic t w)
200+ liftedWritten0 = fmap snd result0
201+ liftedWritten' = fmap (fmap snd) result'
202+ --TODO: We should be able to improve the performance here by incrementally updating the mconcat of the merged Dynamics
203+ i <- holdIncremental liftedWritten0 liftedWritten'
204+ tellDyn $ fmap (mconcat . IntMap.elems) $ incrementalToDynamic $ mergeMyDynIncremental i
205+ return (liftedResult0, liftedResult')
206+
175207-- | Map a function over the output of a 'DynamicWriterT'.
176208withDynamicWriterT :: (Monoid w, Monoid w', Reflex t, MonadHold t m, MonadFix m)
177209 => (w -> w')