module Bitcoin.Misc.Monad where
import Control.Monad
import Control.Monad.State
mapAccumM :: Monad m => (a -> b -> m (a, c)) -> a -> [b] -> m (a, [c])
mapAccumM act s0 xs
= liftM swap
$ runStateT (mapM (\x -> StateT (\s -> liftM swap $ act s x)) xs) s0
where
swap (x,y) = (y,x)
mapAccumM_ :: Monad m => (a -> b -> m (a, c)) -> a -> [b] -> m [c]
mapAccumM_ act s0 xs = liftM snd (mapAccumM act s0 xs)
flippedMapAccumM :: Monad m => a -> [b] -> (a -> b -> m (a, c)) -> m (a, [c])
flippedMapAccumM s0 xs act = mapAccumM act s0 xs
flippedMapAccumM_ :: Monad m => a -> [b] -> (a -> b -> m (a, c)) -> m [c]
flippedMapAccumM_ s0 xs act = mapAccumM_ act s0 xs