{-# LANGUAGE FlexibleContexts #-} -- | Parser to parse Tibetan numerals module Text.Megaparsec.Lexer.Tibetan ( parseNumber ) where import Data.Composition import qualified Data.Text as T import Text.Megaparsec import Text.Megaparsec.Text import Text.Megaparsec.Prim import System.Environment import Data.Either.Combinators -- | Yields a command line parser in case you want a command-line executable for use with another language readBo :: String -> Maybe Integer readBo = rightToMaybe . (runParser parseNumber "") . T.pack -- | Parse Tibetan numerals, returning a positive integer parseNumber :: Parser Integer parseNumber = do digits <- reverse <$> some parseNumeral (pure . (`div` 10) $ foldr ((*10) .* (+)) 0 digits) "tibetan integer" -- | Parse a single digit parseNumeral :: Parser Integer parseNumeral = foldr (<|>) (parseDigit '༠' 0) $ zipWith parseDigit "༠༡༢༣༤༥༦༧༨༩" (0:[1..9]) -- | Parser a given char as a given integer parseDigit :: Char -> Integer -> Parser Integer parseDigit c i = do char c pure i