@@ -102,6 +102,14 @@ module Reflex.Class
102102 , mapAccumM_
103103 , mapAccumMaybe_
104104 , mapAccumMaybeM_
105+ , accumIncremental
106+ , accumMIncremental
107+ , accumMaybeIncremental
108+ , accumMaybeMIncremental
109+ , mapAccumIncremental
110+ , mapAccumMIncremental
111+ , mapAccumMaybeIncremental
112+ , mapAccumMaybeMIncremental
105113 , zipListWithEvent
106114 , numberOccurrences
107115 , numberOccurrencesFrom
@@ -348,6 +356,35 @@ class MonadSample t m => MonadHold t m where
348356 -- the supplied 'Event'.
349357 headE :: Event t a -> m (Event t a)
350358
359+accumIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> p) -> PatchTarget p -> Event t b -> m (Incremental t p)
360+accumIncremental f = accumMaybeIncremental $ \v o -> Just $ f v o
361+accumMIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> PushM t p) -> PatchTarget p -> Event t b -> m (Incremental t p)
362+accumMIncremental f = accumMaybeMIncremental $ \v o -> Just <$> f v o
363+accumMaybeIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> Maybe p) -> PatchTarget p -> Event t b -> m (Incremental t p)
364+accumMaybeIncremental f = accumMaybeMIncremental $ \v o -> return $ f v o
365+accumMaybeMIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> PushM t (Maybe p)) -> PatchTarget p -> Event t b -> m (Incremental t p)
366+accumMaybeMIncremental f z e = do
367+ rec let e' = flip push e $ \o -> do
368+ v <- sample $ currentIncremental d'
369+ f v o
370+ d' <- holdIncremental z e'
371+ return d'
372+mapAccumIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> (p, c)) -> PatchTarget p -> Event t b -> m (Incremental t p, Event t c)
373+mapAccumIncremental f = mapAccumMaybeIncremental $ \v o -> bimap Just Just $ f v o
374+mapAccumMIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> PushM t (p, c)) -> PatchTarget p -> Event t b -> m (Incremental t p, Event t c)
375+mapAccumMIncremental f = mapAccumMaybeMIncremental $ \v o -> bimap Just Just <$> f v o
376+mapAccumMaybeIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> (Maybe p, Maybe c)) -> PatchTarget p -> Event t b -> m (Incremental t p, Event t c)
377+mapAccumMaybeIncremental f = mapAccumMaybeMIncremental $ \v o -> return $ f v o
378+mapAccumMaybeMIncremental :: (Reflex t, Patch p, MonadHold t m, MonadFix m) => (PatchTarget p -> b -> PushM t (Maybe p, Maybe c)) -> PatchTarget p -> Event t b -> m (Incremental t p, Event t c)
379+mapAccumMaybeMIncremental f z e = do
380+ rec let e' = flip push e $ \o -> do
381+ v <- sample $ currentIncremental d'
382+ result <- f v o
383+ return $ case result of
384+ (Nothing, Nothing) -> Nothing
385+ _ -> Just result
386+ d' <- holdIncremental z $ fmapMaybe fst e'
387+ return (d', fmapMaybe snd e')
351388
352389slowHeadE :: (Reflex t, MonadHold t m, MonadFix m) => Event t a -> m (Event t a)
353390slowHeadE e = do