-- |The type class for HTTP status codes.
--
+-- Declaring types for each statuses is surely a pain. See:
+-- 'statusCodes'
+--
-- Minimal complete definition: 'numericCode' and 'textualStatus'.
class (Eq sc, Show sc, Typeable sc) ⇒ StatusCode sc where
-- |Return the 3-digit integer for this status e.g. @200@
toStatusCode ∷ SomeStatusCode → Maybe sc
toStatusCode (SomeStatusCode sc) = cast sc
--- |FIXME: doc
+-- |Container type for 'StatusCode' type class.
data SomeStatusCode
= ∀sc. StatusCode sc ⇒ SomeStatusCode sc
deriving Typeable
instance Show SomeStatusCode where
show (SomeStatusCode sc) = show sc
+-- |Two 'StatusCode's @a@ and @b@ are said to be equivalent iff
+-- @'numericCode' a == 'numericCode' b@.
instance Eq SomeStatusCode where
(SomeStatusCode α) == (SomeStatusCode β)
= numericCode α ≡ numericCode β
fromStatusCode = id
toStatusCode = Just
--- |FIXME: doc
+-- |'QuasiQuoter' for 'StatusCode' declarations.
+--
+-- Top-level splicing
+--
+-- @
+-- ['statusCodes'|
+-- 200 OK
+-- 400 Bad Request
+-- 405 Method Not Allowed
+-- |]
+-- @
+--
+-- becomes:
+--
+-- @
+-- data OK = OK deriving ('Eq', 'Show', 'Typeable')
+-- instance OK where
+-- 'numericCode' _ = 200
+-- 'textualStatus' _ = 'A.unsafeFromString' \"200 OK\"
+--
+-- data BadRequest = BadRequest deriving ('Eq', 'Show', 'Typeable')
+-- instance BadRequest where
+-- 'numericCode' _ = 400
+-- 'textualStatus' _ = 'A.unsafeFromString' \"400 Bad Request\"
+--
+-- data MethodNotAllowed = MethodNotAllowed deriving ('Eq', 'Show', 'Typeable')
+-- instance MethodNotAllowed where
+-- 'numericCode' _ = 405
+-- 'textualStatus' _ = 'A.unsafeFromString' \"405 Method Not Allowed\"
+-- @
statusCodes ∷ QuasiQuoter
statusCodes = QuasiQuoter {
quoteExp = const unsupported