{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module T7 where

import Control.Monad.Trans.Either
import Control.Monad.Trans.Reader
import Network.Wai
import Servant

type ReaderAPI = "a" :> Get '[JSON] Int
            :<|> "b" :> Get '[JSON] String

readerAPI :: Proxy ReaderAPI
readerAPI = Proxy

readerServerT :: ServerT ReaderAPI (Reader String)
readerServerT = a :<|> b

  where a :: Reader String Int
        a = return 1797

        b :: Reader String String
        b = ask

readerServer :: Server ReaderAPI
readerServer = enter readerToEither readerServerT

  where readerToEither :: Reader String :~> EitherT ServantErr IO
        readerToEither = Nat $ \r -> return (runReader r "hi")

app :: Application
app = serve readerAPI readerServer