char-qq-0.1: library/CharQq.hs
module CharQq
(
ord,
ords,
)
where
import CharQq.Prelude hiding (ord, chr)
import Language.Haskell.TH.Syntax
import Language.Haskell.TH.Quote
import qualified CharQq.Prelude as Prelude
-- * Quasi-quoters
-------------------------
{-|
A quasi-quoter which produces a unicode codepoint integer literal of a char.
E.g.,
>>> [CharQq.ord|Z|]
90
Works in the context of expressions and patterns.
-}
ord :: QuasiQuoter
ord = QuasiQuoter exp pat typ dec where
exp = stringOrdExpQ
pat = stringOrdPatQ
typ = const (fail "Unsupported")
dec = const (fail "Unsupported")
{-|
A quasi-quoter which produces a list of unicode codepoint integral literals of a sequence of chars.
E.g.,
>>> [CharQq.ords|абв|]
[1072,1073,1074]
Works in the context of expressions and patterns.
-}
ords :: QuasiQuoter
ords = QuasiQuoter exp pat typ dec where
exp = stringOrdsExpQ
pat = stringOrdsPatQ
typ = const (fail "Unsupported")
dec = const (fail "Unsupported")
-- * Q
-------------------------
stringOrdExpQ :: String -> Q Exp
stringOrdExpQ = \ case
[char] -> return (LitE (IntegerL (fromIntegral (Prelude.ord char))))
[] -> fail "Empty quotation"
_ -> fail "Overlong quotation"
stringOrdPatQ :: String -> Q Pat
stringOrdPatQ = \ case
[char] -> return (LitP (IntegerL (fromIntegral (Prelude.ord char))))
[] -> fail "Empty quotation"
_ -> fail "Overlong quotation"
stringOrdsExpQ :: String -> Q Exp
stringOrdsExpQ = return . ListE . map (LitE . IntegerL . fromIntegral . Prelude.ord)
stringOrdsPatQ :: String -> Q Pat
stringOrdsPatQ = return . ListP . map (LitP . IntegerL . fromIntegral . Prelude.ord)