Add a small class for Nodes and Instances
[ganeti-local] / Ganeti / HTools / Types.hs
1 {-| Some common types.
2
3 -}
4
5 module Ganeti.HTools.Types
6     where
7
8 import qualified Ganeti.HTools.Container as Container
9 import qualified Ganeti.HTools.Instance as Instance
10 import qualified Ganeti.HTools.Node as Node
11
12 type NodeList = Container.Container Node.Node
13 type InstanceList = Container.Container Instance.Instance
14
15 -- | The type used to hold idx-to-name mappings
16 type NameList = [(Int, String)]
17
18 -- | The type used to hold name-to-idx mappings
19 type NameAssoc = [(String, Int)]
20
21 type IdxNode = [(Int, Node.Node)]
22 type IdxInstance = [(Int, Instance.Instance)]
23
24 {-
25
26 This is similar to the JSON library Result type - *very* similar, but
27 we want to use it in multiple places, so we abstract it into a
28 mini-library here
29
30 -}
31
32 data Result a
33     = Bad String
34     | Ok a
35     deriving (Show)
36
37 instance Monad Result where
38     (>>=) (Bad x) _ = Bad x
39     (>>=) (Ok x) fn = fn x
40     return = Ok
41     fail = Bad
42
43 -- | A generic class for nodes and instances
44 class Element a where
45     name    :: a -> String
46     idx     :: a -> Int
47     setName :: a -> String -> a
48     setIdx  :: a -> Int -> a
49
50 -- Let's make nodes elements of the cluster
51 instance Element Node.Node where
52     name = Node.name
53     idx = Node.idx
54     setName = Node.setName
55     setIdx = Node.setIdx
56
57 -- And instances too
58 instance Element Instance.Instance where
59     name = Instance.name
60     idx = Instance.idx
61     setName = Instance.setName
62     setIdx = Instance.setIdx