Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE MultiParamTypeClasses #-}
- module DataLib where
- class Record a where
- getId :: a -> Int
- insert :: Record a => a -> [a] -> [a]
- insert r rs = r : rs
- update :: Record a => a -> [a] -> [a]
- update r rs = map (\r' -> if getId r == getId r' then r else r') rs
- delete :: Record a => Int -> [a] -> [a]
- delete i rs = filter (\r' -> getId r' /= i) rs
- data Person = Person { personId :: Int, name :: String }
- instance Record Person where
- getId = personId
- data Book = Book { bookId :: Int, title :: String }
- instance Record Book where
- getId = bookId
- data Database = Database { employees :: [Person], books :: [Book], customers :: [Person] }
- class (Record r) => Table r t where
- getRecords :: t -> Database -> [r]
- setRecords :: t -> [r] -> Database -> Database
- insertRecord :: (Table r t) => t -> r -> Database -> Database
- insertRecord t r db =
- let records = getRecords t db
- newRecords = insert r records
- in setRecords t newRecords db
- updateRecord :: (Table r t) => t -> r -> Database -> Database
- updateRecord t r db =
- let records = getRecords t db
- newRecords = update r records
- in setRecords t newRecords db
- deleteRecord :: (Table r t) => t -> Int -> Database -> Database
- deleteRecord t i db =
- let records = getRecords t db
- newRecords = delete i records
- in setRecords t newRecords db
- data ET = EmployeeTable
- instance (Table Person) ET where
- getRecords t db = employees db
- setRecords t records db = Database records (books db) (customers db)
- data BT = BookTable
- instance (Table Book) BT where
- getRecords t db = books db
- setRecords t records db = Database (employees db) records (customers db)
- data CT = CustomerTable
- instance (Table Person) CT where
- getRecords t db = customers db
- setRecords t records db = Database (employees db) (books db) records
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement