@@ -0,0 +1,49 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE DeriveGeneric #-}
4+{-# LANGUAGE TypeOperators #-}
5+module GS2 where
6+
7+import Data.Aeson
8+import Data.Time.Calendar
9+import GHC.Generics
10+import Network.Wai
11+import Servant
12+
13+data User = User
14+ { name :: String
15+ , age :: Int
16+ , email :: String
17+ , registration_date :: Day
18+ } deriving (Eq, Show, Generic)
19+
20+-- orphan ToJSON instance for Day. necessary to derive one for User
21+instance ToJSON Day where
22+ -- display a day in YYYY-mm-dd format
23+ toJSON d = toJSON (showGregorian d)
24+
25+instance ToJSON User
26+
27+type UserAPI = "users" :> Get '[JSON] [User]
28+ :<|> "albert" :> Get '[JSON] User
29+ :<|> "isaac" :> Get '[JSON] User
30+
31+isaac :: User
32+isaac = User "Isaac Newton" 372 "isaac@newton.co.uk" (fromGregorian 1683 3 1)
33+
34+albert :: User
35+albert = User "Albert Einstein" 136 "ae@mc2.org" (fromGregorian 1905 12 1)
36+
37+users :: [User]
38+users = [isaac, albert]
39+
40+userAPI :: Proxy UserAPI
41+userAPI = Proxy
42+
43+server :: Server UserAPI
44+server = return users
45+ :<|> return albert
46+ :<|> return isaac
47+
48+app :: Application
49+app = serve userAPI server