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
        [("Content-Type", "text/plain")]
        "Hello, Web!"

main :: IO ()
main = do
    putStrLn $ "http://localhost:8080/"
    pool <- getPool
    run 8080 $ app $ pool
  • 1
    \$\begingroup\$ Welcome to Code Review. Asking for advice on code yet to be written or implemented is off-topic for this site. See What topics can I ask about? for reference. Once you have written working code, you're welcome to ask a new question here and we can then help you improve it! \$\endgroup\$ – Phrancis Jul 26 '18 at 0:20
  • \$\begingroup\$ Updated with working, written code. \$\endgroup\$ – 599644 Jul 26 '18 at 23:15
  • \$\begingroup\$ OK good, I've flagged your question to be reopened. \$\endgroup\$ – Phrancis Jul 26 '18 at 23:36

I'm afraid there isn't much to remove. The $ after putStrLn and between app and pool are superfluous. You could write the last two lines run 8080 . app <$> getPool. I'd inline getPool. You may be interested in https://github.com/alevy/simple/blob/master/simple/src/Web/Simple.hs#L134 for boilerplate reduction.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.