packages feed

axel-0.0.12: src/Axel/Utils/Maybe.hs

module Axel.Utils.Maybe where

import Axel.Prelude

import Data.Functor.Identity (runIdentity)

foldMUntilNothing :: (Monad m) => (a -> Maybe a) -> (a -> m a) -> a -> m a
foldMUntilNothing move modify x = do
  modified <- modify x
  case move modified of
    Nothing -> pure modified
    Just moved -> foldMUntilNothing move modify moved

foldUntilNothing :: (a -> Maybe a) -> (a -> a) -> a -> a
foldUntilNothing move modify =
  runIdentity . foldMUntilNothing move (pure . modify)