    module Network.Wai.Middleware.Rewrite
        ( rewrite, rewritePure
        ) where

    import Network.Wai
    import Control.Monad.IO.Class (liftIO)
    import Data.Text (Text)
    import qualified Data.Text.Encoding as TE
    import qualified Data.Text as T
    import Network.HTTP.Types as H

    -- | rewrite based on your own conversion rules
    rewrite :: ([Text] -> H.RequestHeaders -> IO [Text]) -> Middleware
    rewrite convert app req sendResponse = do
      newPathInfo <- liftIO $ convert (pathInfo req) (requestHeaders req)
      let rawPInfo = TE.encodeUtf8 $ T.intercalate "/" newPathInfo
      app req { pathInfo = newPathInfo, rawPathInfo =  rawPInfo } sendResponse

    -- | rewrite based on your own conversion rules
    -- Example convert function:

    -- staticConvert :: [Text] -> H.RequestHeaders -> [Text]
    -- staticConvert pieces _ = piecesConvert pieces
    --   where
    --    piecesConvert [] = ["static", "html", "pages.html"]
    --    piecesConvert route@("pages":_) = "static":"html":route
    rewritePure :: ([Text] -> H.RequestHeaders -> [Text]) -> Middleware
    rewritePure convert app req =
      let pInfo = convert (pathInfo req) (requestHeaders req)
          rawPInfo = TE.encodeUtf8 $ T.intercalate "/" pInfo
      in  app req { pathInfo = pInfo, rawPathInfo =  rawPInfo }