Add a function to leave the list monad
authorKlaus Aehlig <aehlig@google.com>
Fri, 14 Feb 2014 23:12:23 +0000 (00:12 +0100)
committerKlaus Aehlig <aehlig@google.com>
Thu, 26 Mar 2015 14:21:13 +0000 (15:21 +0100)
The list monad provides convenient syntax for non-deterministic
algorithms. Add a function leaving that monad with this intuition
in mind.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Petr Pudlak <pudlak@google.com>

Cherry-picked-from: a1da8a503ba
Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Hrvoje Ribicic <riba@google.com>

src/Ganeti/BasicTypes.hs

index 87899f5..aee67ad 100644 (file)
@@ -43,6 +43,7 @@ module Ganeti.BasicTypes
   , annotateResult
   , iterateOk
   , select
+  , runListHead
   , LookupResult(..)
   , MatchPriority(..)
   , lookupName
@@ -59,6 +60,7 @@ import Control.Monad
 import Control.Monad.Trans
 import Data.Function
 import Data.List
+import Data.Maybe (listToMaybe)
 import Data.Set (Set)
 import qualified Data.Set as Set (empty)
 import Text.JSON (JSON)
@@ -166,6 +168,12 @@ select :: a            -- ^ default result
        -> a            -- ^ first result which has a True condition, or default
 select def = maybe def snd . find fst
 
+-- | Apply a function to the first element of a list, return the default
+-- value, if the list is empty. This is just a convenient combination of
+-- maybe and listToMaybe.
+runListHead :: a -> (b -> a) -> [b] -> a
+runListHead a f = maybe a f . listToMaybe
+
 -- * Lookup of partial names functionality
 
 -- | The priority of a match in a lookup result.