packages feed

wai-env-1.0.0.0: src/Network/Wai/Middleware/Environment.hs

module Network.Wai.Middleware.Environment
  ( withEnvironment,
    environment,
  )
where

import Data.Default (Default, def)
import Data.Maybe (fromMaybe)
import qualified Data.Vault.Lazy as V
import Network.Wai (Middleware, Request (..))
import System.IO.Unsafe (unsafePerformIO)

vaultKey :: Default a => V.Key a
vaultKey = unsafePerformIO V.newKey
{-# NOINLINE vaultKey #-}

-- | Parametize subsequent requests with environment.
withEnvironment :: Default a => a -> Middleware
withEnvironment env app req respond = do
  let req' = req {vault = V.insert vaultKey env (vault req)}
  app req' respond

-- | Retrieve request environment.
environment :: Default a => Request -> a
environment = fromMaybe def . V.lookup vaultKey . vault