@@ -0,0 +1,51 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE DeriveGeneric #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+import Data.Aeson
5+import Data.Text
6+import GHC.Generics
7+import Network.Wai
8+import Network.Wai.Handler.Warp
9+import Network.Wai.Middleware.RequestLogger
10+import Servant
11+
12+data Product = Product
13+ { name :: Text
14+ , brand :: Text
15+ , current_price_eur :: Double
16+ , available :: Bool
17+ } deriving (Eq, Show, Generic)
18+
19+instance ToJSON Product
20+
21+products :: [Product]
22+products = [p1, p2]
23+
24+ where p1 = Product "Haskell laptop sticker"
25+ "GHC Industries"
26+ 2.50
27+ True
28+
29+ p2 = Product "Foldable USB drive"
30+ "Well-Typed"
31+ 13.99
32+ False
33+
34+type SimpleAPI = Get '[JSON] [Product]
35+
36+simpleAPI :: Proxy SimpleAPI
37+simpleAPI = Proxy
38+
39+server :: Server SimpleAPI
40+server = return products
41+
42+-- logStdout :: Middleware
43+-- i.e, logStdout :: Application -> Application
44+-- serve :: Proxy api -> Server api -> Application
45+-- so applying a middleware is really as simple as
46+-- applying a function to the result of 'serve'
47+app :: Application
48+app = logStdout (serve simpleAPI server)
49+
50+main :: IO ()
51+main = run 8080 app