<div dir="auto">Thinking about fusing indexed maps for lists led me to consider the following function, which generalizes mapWithIndex to allow arbitrary stateful computation <div dir="auto"><div dir="auto"><br></div><div dir="auto"><div dir="auto">foldWithUnfold</div><div dir="auto">  :: (a -> s -> Maybe (b, s))</div><div dir="auto">  -> [a]</div><div dir="auto">  -> s</div><div dir="auto">  -> [b]</div><div dir="auto"><span style="font-family:sans-serif">foldWithUnfold f = go</span></div><div dir="auto"><span style="font-family:sans-serif">  where</span></div><div dir="auto"><span style="font-family:sans-serif">    go (a : as) s</span><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">      | Just (b, s') <- f a s</span></div><div dir="auto"><span style="font-family:sans-serif">      = b : go</span><span style="font-family:sans-serif"> as s'</span></div><div dir="auto"><span style="font-family:sans-serif">    go _ _ = []</span><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">which we can fit into fold/build fusion like so:</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto">foldWithUnfold f as s0 =</div><div dir="auto">  build $ \c n -></div><div dir="auto">    let</div><div dir="auto">      go a k s</div><div dir="auto">        | Just (b, s') <- f a s</div><div dir="auto">        = b `c` k s'</div><div dir="auto">        | otherwise</div><div dir="auto">        = n</div><div dir="auto">    in foldr go (const n) as s0</div><div dir="auto"><br></div><div dir="auto">Does a function of this general nature exist in some package already?</div><div dir="auto"><br></div><div dir="auto">Also, I see that the type can be expressed</div><div dir="auto"><br></div><div dir="auto"><div dir="auto" style="font-family:sans-serif">foldWithUnfoldS</div><div dir="auto" style="font-family:sans-serif">  :: (a -> StateT s Maybe b)</div><div dir="auto" style="font-family:sans-serif">  -> [a]</div><div dir="auto" style="font-family:sans-serif">  -> s</div><div dir="auto" style="font-family:sans-serif">  -> [b]</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">Is that a better or worse way to say it?</div></div></div></div></div>