    -- | Timeout requests
    module Network.Wai.Middleware.Timeout
        ( timeout
        , timeoutStatus
        , timeoutAs
        ) where

    import Network.HTTP.Types (Status, status503)
    import Network.Wai
    import qualified System.Timeout as Timeout

    -- | Time out the request after the given number of seconds
    --
    -- Timeouts respond with @'status503'@. See @'timeoutStatus'@ or @'timeoutAs'@
    -- to customize the behavior of the timed-out case.
    --
    -- @since 3.0.24.0@
    timeout :: Int -> Middleware
    timeout = timeoutStatus status503

    -- | Time out with the given @'Status'@
    --
    -- @since 3.0.24.0@
    timeoutStatus :: Status -> Int -> Middleware
    timeoutStatus status = timeoutAs $ responseLBS status [] ""

    -- | Time out with the given @'Response'@
    --
    -- @since 3.0.24.0@
    timeoutAs :: Response -> Int -> Middleware
    timeoutAs timeoutReponse seconds app req respond =
        maybe (respond timeoutReponse) pure
            =<< Timeout.timeout (seconds * 1000000) (app req respond)