{- | Parse digits from type-level 'Char's. A 'Nothing' indicates the given 'Char' was not a valid digit for the given base. -} module Data.Type.Char.Digits where import GHC.TypeLits -- | Parse a binary digit (0 or 1). type family ParseBinaryDigit (ch :: Char) :: Maybe Natural where ParseBinaryDigit '0' = 'Just 0 ParseBinaryDigit '1' = 'Just 1 ParseBinaryDigit _ = 'Nothing -- | Parse an octal digit (0-7). type family ParseOctalDigit (ch :: Char) :: Maybe Natural where ParseOctalDigit '0' = 'Just 0 ParseOctalDigit '1' = 'Just 1 ParseOctalDigit '2' = 'Just 2 ParseOctalDigit '3' = 'Just 3 ParseOctalDigit '4' = 'Just 4 ParseOctalDigit '5' = 'Just 5 ParseOctalDigit '6' = 'Just 6 ParseOctalDigit '7' = 'Just 7 ParseOctalDigit _ = 'Nothing -- | Parse a decimal digit (0-9). type family ParseDecimalDigit (ch :: Char) :: Maybe Natural where ParseDecimalDigit '0' = 'Just 0 ParseDecimalDigit '1' = 'Just 1 ParseDecimalDigit '2' = 'Just 2 ParseDecimalDigit '3' = 'Just 3 ParseDecimalDigit '4' = 'Just 4 ParseDecimalDigit '5' = 'Just 5 ParseDecimalDigit '6' = 'Just 6 ParseDecimalDigit '7' = 'Just 7 ParseDecimalDigit '8' = 'Just 8 ParseDecimalDigit '9' = 'Just 9 ParseDecimalDigit _ = 'Nothing -- | Parse a hexadecimal digit (0-9A-Fa-f). -- -- Both upper and lower case are permitted. type family ParseHexDigit (ch :: Char) :: Maybe Natural where ParseHexDigit '0' = 'Just 0 ParseHexDigit '1' = 'Just 1 ParseHexDigit '2' = 'Just 2 ParseHexDigit '3' = 'Just 3 ParseHexDigit '4' = 'Just 4 ParseHexDigit '5' = 'Just 5 ParseHexDigit '6' = 'Just 6 ParseHexDigit '7' = 'Just 7 ParseHexDigit '8' = 'Just 8 ParseHexDigit '9' = 'Just 9 ParseHexDigit 'a' = 'Just 10 ParseHexDigit 'A' = 'Just 10 ParseHexDigit 'b' = 'Just 11 ParseHexDigit 'B' = 'Just 11 ParseHexDigit 'c' = 'Just 12 ParseHexDigit 'C' = 'Just 12 ParseHexDigit 'd' = 'Just 13 ParseHexDigit 'D' = 'Just 13 ParseHexDigit 'e' = 'Just 14 ParseHexDigit 'E' = 'Just 14 ParseHexDigit 'f' = 'Just 15 ParseHexDigit 'F' = 'Just 15 ParseHexDigit _ = 'Nothing