char-qq-0.1.1: library/CharQq/Q.hs
module CharQq.Q
where
import CharQq.Prelude
import qualified CharQq.Exp as Exp
import qualified CharQq.Pat as Pat
stringChar :: String -> Q Char
stringChar = \ case
[char] -> return char
[] -> fail "Empty quotation"
_ -> fail "More than one char in the quotation"
stringCodepointExp :: String -> Q Exp
stringCodepointExp = fmap Exp.codepoint . stringChar
stringCodepointPat :: String -> Q Pat
stringCodepointPat = fmap Pat.codepoint . stringChar
stringCodepointsExp :: String -> Q Exp
stringCodepointsExp = return . Exp.codepoints
stringCodepointsPat :: String -> Q Pat
stringCodepointsPat = return . Pat.codepoints
codepointChar :: Int -> Q Char
codepointChar codepoint = if codepoint <= ord maxBound
then return (chr codepoint)
else fail "Codepoint is out of the supported Unicode range"
stringInt :: String -> Q Int
stringInt string = case readMaybe string of
Just int -> return int
Nothing -> fail "String doesn't parse to integer"
stringCodepointChar :: String -> Q Char
stringCodepointChar = stringInt >=> codepointChar
stringCodepointCharExp :: String -> Q Exp
stringCodepointCharExp = fmap Exp.char . stringCodepointChar
stringCodepointCharPat :: String -> Q Pat
stringCodepointCharPat = fmap Pat.char . stringCodepointChar