I was wondering if below is the correct convention for combining Wai with a Database pool.
What I basically do is, create a pool, partially apply a function of type Pool -> Application
and use it to pass it to Warp's run
. Does it look ok, or shall I refactor it?
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Database.MySQL.Simple
import Data.Pool (Pool, createPool, withResource)
newConn = connect defaultConnectInfo
{ connectHost = "db"
, connectUser = "root"
, connectPassword = "secret"
, connectDatabase = "test" }
getPool = createPool newConn close 1 10 5
app :: Pool Connection -> Application
app pool _ respond = do
withResource pool $ \c -> query_ c "SELECT 1" :: IO [Only Int]
respond $ responseLBS
status200
[("Content-Type", "text/plain")]
"Hello, Web!"
main :: IO ()
main = do
putStrLn $ "http://localhost:8080/"
pool <- getPool
c <- connect defaultConnectInfo
{ connectHost = "db"
, connectUser = "root"
, connectPassword = "secret"
, connectDatabase = "test" }
x <- (query_ c "SELECT 1") :: IO [Only Int]
run 8080 $ app $ pool