module Lib ( foldrM ) where import Control.Monad ((>=>)) foldrM :: (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m b foldrM f z xs = go z where (ys, go) = foldr (\x k s ~(y:ys) -> let (s', go) = k (x:s) ys in (s', f y >=> go)) (\s _ -> (s, pure)) xs [] ys