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

import           Control.Monad.Trans.Except
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 :~> ExceptT ServantErr IO
        readerToEither = Nat $ \r -> return (runReader r "hi")

app :: Application
app = serve readerAPI EmptyConfig readerServer