import Control.Applicative
import Data.Ascii (Ascii, AsciiBuilder)
import qualified Data.Ascii as A
-import Data.Attoparsec.Char8 as P
-import Data.Attoparsec.Lazy as LP
+import Data.Attoparsec.Char8
+import qualified Data.Attoparsec.Lazy as LP
import qualified Data.ByteString.Lazy.Char8 as Lazy
import Data.Convertible.Base
import Data.Convertible.Instances.Ascii ()
numericCode ∷ sc → Int
-- |Return the combination of 3-digit integer and reason phrase
-- for this status e.g. @200 OK@
- textualStatus ∷ sc → Ascii
+ textualStatus ∷ sc → AsciiBuilder
-- |Wrap the status code into 'SomeStatusCode'.
fromStatusCode ∷ sc → SomeStatusCode
fromStatusCode = SomeStatusCode
instance StatusCode sc ⇒ ConvertSuccess sc AsciiBuilder where
{-# INLINE convertSuccess #-}
- convertSuccess = cs ∘ textualStatus
+ convertSuccess = textualStatus
instance StatusCode sc ⇒ ConvertAttempt sc Ascii where
{-# INLINE convertAttempt #-}
-- data OK = OK deriving ('Show')
-- instance OK where
-- 'numericCode' _ = 200
--- 'textualStatus' _ = 'A.unsafeFromString' \"200 OK\"
+-- 'textualStatus' _ = 'cs' (\"200 OK\" ∷ Ascii)
--
-- data BadRequest = BadRequest deriving ('Show')
-- instance BadRequest where
-- 'numericCode' _ = 400
--- 'textualStatus' _ = 'A.unsafeFromString' \"400 Bad Request\"
+-- 'textualStatus' _ = 'cs' (\"400 Bad Request\" ∷ Ascii)
--
-- data MethodNotAllowed = MethodNotAllowed deriving ('Show')
-- instance MethodNotAllowed where
-- 'numericCode' _ = 405
--- 'textualStatus' _ = 'A.unsafeFromString' \"405 Method Not Allowed\"
+-- 'textualStatus' _ = 'cs' (\"405 Method Not Allowed\" ∷ Ascii)
-- @
statusCodes ∷ QuasiQuoter
statusCodes = QuasiQuoter {
"pair"
word ∷ Parser Ascii
- word = A.unsafeFromByteString <$> P.takeWhile1 isAlpha_ascii
+ word = A.unsafeFromByteString <$> takeWhile1 isAlpha_ascii
statusDecl ∷ (Int, [Ascii]) → Q [Dec]
statusDecl (num, phrase)
return (a:bs)
where
name ∷ Name
- name = mkName $ concatMap A.toString phrase
+ name = mkName $ concatMap cs phrase
dataDecl ∷ Q Dec
dataDecl = dataD (cxt []) name [] [con] [''Show]
con = return $ NormalC name []
txt ∷ Q Exp
- txt = [| A.unsafeFromString $(lift txt') |]
+ txt = [| cs ($(lift txt') ∷ Ascii) |]
txt' ∷ String
txt' = concat $ intersperse "\x20"
- $ show num : map A.toString phrase
+ $ show num : map cs phrase