1{-# OPTIONS -fglasgow-exts #-}
2
3module CompanyDatatypes where
4
5import Data.Generics (Data, Typeable)
6
7-- The organisational structure of a company
8
9data Company  = C [Dept]               deriving (Eq, Show, Typeable, Data)
10data Dept     = D Name Manager [Unit]  deriving (Eq, Show, Typeable, Data)
11data Unit     = PU Employee | DU Dept  deriving (Eq, Show, Typeable, Data)
12data Employee = E Person Salary        deriving (Eq, Show, Typeable, Data)
13data Person   = P Name Address         deriving (Eq, Show, Typeable, Data)
14data Salary   = S Float                deriving (Eq, Show, Typeable, Data)
15type Manager  = Employee
16type Name     = String
17type Address  = String
18
19-- An illustrative company
20genCom :: Company
21genCom = C [D "Research" laemmel [PU joost, PU marlow],
22            D "Strategy" blair   []]
23
24-- A typo for the sake of testing equality;
25-- (cf. lammel vs. laemmel)
26genCom' :: Company
27genCom' = C [D "Research" lammel [PU joost, PU marlow],
28             D "Strategy" blair   []]
29
30lammel, laemmel, joost, marlow, blair :: Employee
31lammel  = E (P "Lammel" "Amsterdam") (S 8000)
32laemmel = E (P "Laemmel" "Amsterdam") (S 8000)
33joost   = E (P "Joost"   "Amsterdam") (S 1000)
34marlow  = E (P "Marlow"  "Cambridge") (S 2000)
35blair   = E (P "Blair"   "London")    (S 100000)
36
37-- Some more test data
38person1 = P "Lazy" "Home"
39dept1   = D "Useless" (E person1 undefined) []
40