Hi, I try to understand three layer haskell https://www.parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html Lets say I have right now I have code
data Env = Env { db :: SQL.Connection }
newType App a = App { runApp :: ReaderT Env IO a }
getUser :: Text -> App (Maybe User)
getUser id = do
conn <- asks db
liftIO $ query conn "select..." id
someWebServer $ do
get "/user" $ do
user <- getUser "abc"
render template user
Now, when I try to folow https://github.com/Holmusk/three-layer/tree/master repo that is mentioned as example in this article, the code would look like this:
data Env = Env { db :: SQL.Connection }
newType App a = App { runApp :: ReaderT Env IO a }
class Monad m => AcquireUser m where
getUser :: Text -> m (Maybe User)
class HasDB env where
getDB :: env -> Connection
instance HasDB Env where
getDB = db
grabDB :: (MonadReader env m, HasDB env) => m Connection
grabDB = asks getDB
type WithDb env m = (MonadReader env m, HasDB env, MonadIO m)
instance AcquireUser App where
getUser = getUserImpl
getUserImpl :: (WithDb env m) => Text -> m (Maybe User)
getUserImpl id = do
conn <- grabDB
liftIO $ query conn "select..." id
someWebServer $ do
get "/user" $ do
user <- getUser "abc"
render template user