module Company where

newtype DeptNo = DeptNo Int
   deriving (Eq, Ord, Show)

data Dept =
   Dept {
      deptnoDept :: DeptNo,
      dname :: String,
      loc :: String
   }
   deriving (Eq, Ord, Show)

dept :: [Dept]
dept =
   Dept (DeptNo 10) "ACCOUNTING" "NEW YORK" :
   Dept (DeptNo 20) "RESEARCH" "DALLAS" :
   Dept (DeptNo 30) "SALES" "CHICAGO" :
   Dept (DeptNo 40) "OPERATIONS" "BOSTON" :
   []



data Job =
   Clerk | Salesman | Manager | Analyst | President
   deriving (Eq, Ord, Enum, Show, Bounded)

newtype EmpNo = EmpNo Int
   deriving (Eq, Ord, Show)

data Emp =
   Emp {
      empno :: EmpNo,
      ename :: String,
      job :: Job,
      mgr :: Maybe EmpNo,
      sal :: Int,
      deptnoEmp :: DeptNo
   }
   deriving (Eq, Ord, Show)

emp :: [Emp]
emp =
   Emp (EmpNo 7369) "SMITH" Clerk (Just (EmpNo 7902)) 800 (DeptNo 20) :
   Emp (EmpNo 7499) "ALLEN" Salesman (Just (EmpNo 7698)) 1600 (DeptNo 30) :
   Emp (EmpNo 7521) "WARD" Salesman (Just (EmpNo 7698)) 1250 (DeptNo 30) :
   Emp (EmpNo 7566) "JONES" Manager (Just (EmpNo 7839)) 2975 (DeptNo 20) :
   Emp (EmpNo 7654) "MARTIN" Salesman (Just (EmpNo 7698)) 1250 (DeptNo 30) :
   Emp (EmpNo 7698) "BLAKE" Manager (Just (EmpNo 7839)) 2850 (DeptNo 30) :
   Emp (EmpNo 7782) "CLARK" Manager (Just (EmpNo 7839)) 2450 (DeptNo 10) :
   Emp (EmpNo 7788) "SCOTT" Analyst (Just (EmpNo 7566)) 3000 (DeptNo 20) :
   Emp (EmpNo 7839) "KING" President Nothing 5000 (DeptNo 10) :
   Emp (EmpNo 7844) "TURNER" Salesman (Just (EmpNo 7698)) 1500 (DeptNo 30) :
   Emp (EmpNo 7876) "ADAMS" Clerk (Just (EmpNo 7788)) 1100 (DeptNo 20) :
   Emp (EmpNo 7900) "JAMES" Clerk (Just (EmpNo 7698)) 950 (DeptNo 30) :
   Emp (EmpNo 7902) "FORD" Analyst (Just (EmpNo 7566)) 3000 (DeptNo 20) :
   Emp (EmpNo 7934) "MILLER" Clerk (Just (EmpNo 7782)) 1300 (DeptNo 10) :
   []


class    DeptNoField r    where deptno :: r -> DeptNo
instance DeptNoField Dept where deptno = deptnoDept
instance DeptNoField Emp  where deptno = deptnoEmp