@@ -0,0 +1,33 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE TypeOperators #-}
4+module GS7 where
5+
6+import Control.Monad.Trans.Either
7+import Control.Monad.Trans.Reader
8+import Network.Wai
9+import Servant
10+
11+type ReaderAPI = "a" :> Get '[JSON] Int
12+ :<|> "b" :> Get '[JSON] String
13+
14+readerAPI :: Proxy ReaderAPI
15+readerAPI = Proxy
16+
17+readerServerT :: ServerT ReaderAPI (Reader String)
18+readerServerT = a :<|> b
19+
20+ where a :: Reader String Int
21+ a = return 1797
22+
23+ b :: Reader String String
24+ b = ask
25+
26+readerServer :: Server ReaderAPI
27+readerServer = enter readerToEither readerServerT
28+
29+ where readerToEither :: Reader String :~> EitherT ServantErr IO
30+ readerToEither = Nat $ \r -> return (runReader r "hi")
31+
32+app :: Application
33+app = serve readerAPI readerServer