3 Copyright (C) 2009, 2010, 2011 Google Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 module Ganeti.BasicTypes
32 -- | This is similar to the JSON library Result type - /very/ similar,
33 -- but we want to use it in multiple places, so we abstract it into a
36 -- The failure value for this monad is simply a string.
40 deriving (Show, Read, Eq)
42 instance Monad Result where
43 (>>=) (Bad x) _ = Bad x
44 (>>=) (Ok x) fn = fn x
48 instance MonadPlus Result where
49 mzero = Bad "zero Result when used as MonadPlus"
50 -- for mplus, when we 'add' two Bad values, we concatenate their
52 (Bad x) `mplus` (Bad y) = Bad (x ++ "; " ++ y)
54 x@(Ok _) `mplus` _ = x
56 -- | Simple checker for whether a 'Result' is OK.
57 isOk :: Result a -> Bool
61 -- | Simple checker for whether a 'Result' is a failure.
62 isBad :: Result a -> Bool
65 -- | Converter from Either String to 'Result'.
66 eitherToResult :: Either String a -> Result a
67 eitherToResult (Left s) = Bad s
68 eitherToResult (Right v) = Ok v
70 -- | Annotate a Result with an ownership information.
71 annotateResult :: String -> Result a -> Result a
72 annotateResult owner (Bad s) = Bad $ owner ++ ": " ++ s
73 annotateResult _ v = v