Revision 0c37d1e4 htools/Ganeti/HTools/Types.hs
b/htools/Ganeti/HTools/Types.hs | ||
---|---|---|
72 | 72 |
, EvacMode(..) |
73 | 73 |
) where |
74 | 74 |
|
75 |
import Control.Monad |
|
76 | 75 |
import qualified Data.Map as M |
77 | 76 |
import qualified Text.JSON as JSON |
78 | 77 |
|
79 | 78 |
import qualified Ganeti.Constants as C |
80 | 79 |
import qualified Ganeti.THH as THH |
80 |
import Ganeti.BasicTypes |
|
81 | 81 |
|
82 | 82 |
-- | The instance index type. |
83 | 83 |
type Idx = Int |
... | ... | |
226 | 226 |
unitCpu :: Int |
227 | 227 |
unitCpu = 1 |
228 | 228 |
|
229 |
-- | This is similar to the JSON library Result type - /very/ similar, |
|
230 |
-- but we want to use it in multiple places, so we abstract it into a |
|
231 |
-- mini-library here. |
|
232 |
-- |
|
233 |
-- The failure value for this monad is simply a string. |
|
234 |
data Result a |
|
235 |
= Bad String |
|
236 |
| Ok a |
|
237 |
deriving (Show, Read, Eq) |
|
238 |
|
|
239 |
instance Monad Result where |
|
240 |
(>>=) (Bad x) _ = Bad x |
|
241 |
(>>=) (Ok x) fn = fn x |
|
242 |
return = Ok |
|
243 |
fail = Bad |
|
244 |
|
|
245 |
instance MonadPlus Result where |
|
246 |
mzero = Bad "zero Result when used as MonadPlus" |
|
247 |
-- for mplus, when we 'add' two Bad values, we concatenate their |
|
248 |
-- error descriptions |
|
249 |
(Bad x) `mplus` (Bad y) = Bad (x ++ "; " ++ y) |
|
250 |
(Bad _) `mplus` x = x |
|
251 |
x@(Ok _) `mplus` _ = x |
|
252 |
|
|
253 |
-- | Simple checker for whether a 'Result' is OK. |
|
254 |
isOk :: Result a -> Bool |
|
255 |
isOk (Ok _) = True |
|
256 |
isOk _ = False |
|
257 |
|
|
258 |
-- | Simple checker for whether a 'Result' is a failure. |
|
259 |
isBad :: Result a -> Bool |
|
260 |
isBad = not . isOk |
|
261 |
|
|
262 |
-- | Converter from Either String to 'Result'. |
|
263 |
eitherToResult :: Either String a -> Result a |
|
264 |
eitherToResult (Left s) = Bad s |
|
265 |
eitherToResult (Right v) = Ok v |
|
266 |
|
|
267 | 229 |
-- | Reason for an operation's falure. |
268 | 230 |
data FailMode = FailMem -- ^ Failed due to not enough RAM |
269 | 231 |
| FailDisk -- ^ Failed due to not enough disk |
Also available in: Unified diff