root / htools / Ganeti / BasicTypes.hs @ 0c37d1e4
History | View | Annotate | Download (1.8 kB)
1 |
{- |
---|---|
2 |
|
3 |
Copyright (C) 2009, 2010, 2011 Google Inc. |
4 |
|
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. |
9 |
|
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. |
14 |
|
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 |
18 |
02110-1301, USA. |
19 |
|
20 |
-} |
21 |
|
22 |
module Ganeti.BasicTypes |
23 |
( Result(..) |
24 |
, isOk |
25 |
, isBad |
26 |
, eitherToResult |
27 |
) where |
28 |
|
29 |
import Control.Monad |
30 |
|
31 |
-- | This is similar to the JSON library Result type - /very/ similar, |
32 |
-- but we want to use it in multiple places, so we abstract it into a |
33 |
-- mini-library here. |
34 |
-- |
35 |
-- The failure value for this monad is simply a string. |
36 |
data Result a |
37 |
= Bad String |
38 |
| Ok a |
39 |
deriving (Show, Read, Eq) |
40 |
|
41 |
instance Monad Result where |
42 |
(>>=) (Bad x) _ = Bad x |
43 |
(>>=) (Ok x) fn = fn x |
44 |
return = Ok |
45 |
fail = Bad |
46 |
|
47 |
instance MonadPlus Result where |
48 |
mzero = Bad "zero Result when used as MonadPlus" |
49 |
-- for mplus, when we 'add' two Bad values, we concatenate their |
50 |
-- error descriptions |
51 |
(Bad x) `mplus` (Bad y) = Bad (x ++ "; " ++ y) |
52 |
(Bad _) `mplus` x = x |
53 |
x@(Ok _) `mplus` _ = x |
54 |
|
55 |
-- | Simple checker for whether a 'Result' is OK. |
56 |
isOk :: Result a -> Bool |
57 |
isOk (Ok _) = True |
58 |
isOk _ = False |
59 |
|
60 |
-- | Simple checker for whether a 'Result' is a failure. |
61 |
isBad :: Result a -> Bool |
62 |
isBad = not . isOk |
63 |
|
64 |
-- | Converter from Either String to 'Result'. |
65 |
eitherToResult :: Either String a -> Result a |
66 |
eitherToResult (Left s) = Bad s |
67 |
eitherToResult (Right v) = Ok v |