module Ribosome.Data.Foldable(
  findMapMaybeM,
) where

import Control.Monad (foldM)

findMapMaybeM :: (Monad m, Foldable f) => (a -> m (Maybe b)) -> f a -> m (Maybe b)
findMapMaybeM :: (a -> m (Maybe b)) -> f a -> m (Maybe b)
findMapMaybeM a -> m (Maybe b)
f f a
fa =
  (Maybe b -> a -> m (Maybe b)) -> Maybe b -> f a -> m (Maybe b)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM Maybe b -> a -> m (Maybe b)
evaluate Maybe b
forall a. Maybe a
Nothing f a
fa
  where
    evaluate :: Maybe b -> a -> m (Maybe b)
evaluate (Just b
b) a
_ = Maybe b -> m (Maybe b)
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> Maybe b
forall a. a -> Maybe a
Just b
b)
    evaluate Maybe b
Nothing a
a = a -> m (Maybe b)
f a
a