{-# LANGUAGE BangPatterns #-}
module Text.EditDistance.MonadUtilities where
{-# INLINE loopM_ #-}
loopM_ :: Monad m => Int -> Int -> (Int -> m ()) -> m ()
loopM_ xfrom xto action = go xfrom xto
where
go from to | from > to = return ()
| otherwise = do action from
go (from + 1) to
{-# INLINE foldM #-}
foldM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
foldM f x xs = foldr (\y rest a -> f a y >>= rest) return xs x
{-# INLINE foldMK #-}
foldMK :: (Monad m) => (a -> b -> m a) -> a -> [b] -> (a -> m res) -> m res
foldMK f x xs k = foldr (\y rest a -> f a y >>= rest) k xs x