Useful for short-circuiting computations.
---
 src/Ganeti/Utils/Monad.hs | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/Ganeti/Utils/Monad.hs b/src/Ganeti/Utils/Monad.hs
index 23df5bd..1753781 100644
--- a/src/Ganeti/Utils/Monad.hs
+++ b/src/Ganeti/Utils/Monad.hs
@@ -35,6 +35,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 module Ganeti.Utils.Monad
   ( mretryN
   , retryMaybeN
+  , anyM
+  , allM
   ) where
 
 import Control.Monad
@@ -49,3 +51,14 @@ mretryN n = msum . flip map [1..n]
 -- The action signals failure by 'mzero'.
 retryMaybeN :: (Monad m) => Int -> (Int -> MaybeT m a) -> m (Maybe a)
 retryMaybeN = (runMaybeT .) . mretryN
+
+
+-- From monad-loops (until we can / want to depend on it):
+
+-- | Short-circuit 'any' with a monadic predicate.
+anyM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool
+anyM p = foldM (\v x -> if v then return True else p x) False
+
+-- | Short-circuit 'all' with a monadic predicate.
+allM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool
+allM p = foldM (\v x -> if v then p x else return False) True
-- 
2.1.0.rc2.206.gedb03e5

Reply via email to