Convenience function for iterating while the result is Ok
authorKlaus Aehlig <aehlig@google.com>
Fri, 14 Jun 2013 15:42:15 +0000 (17:42 +0200)
committerKlaus Aehlig <aehlig@google.com>
Mon, 17 Jun 2013 14:36:42 +0000 (16:36 +0200)
For a function f :: a -> GenericResult a, iterate it (in the sense of the
monad), until the result is Bad; return the list of values occurred.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Michele Tartara <mtartara@google.com>

src/Ganeti/BasicTypes.hs

index f7b024b..080c6a9 100644 (file)
@@ -32,6 +32,7 @@ module Ganeti.BasicTypes
   , isBad
   , eitherToResult
   , annotateResult
+  , iterateOk
   , select
   , LookupResult(..)
   , MatchPriority(..)
@@ -138,6 +139,10 @@ annotateResult :: String -> Result a -> Result a
 annotateResult owner (Bad s) = Bad $ owner ++ ": " ++ s
 annotateResult _ v = v
 
+-- | Iterate while Ok.
+iterateOk :: (a -> GenericResult b a) -> a -> [a]
+iterateOk f a = genericResult (const []) ((:) a . iterateOk f) (f a)
+
 -- * Misc functionality
 
 -- | Return the first result with a True condition, or the default otherwise.