## 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 |