module Text.Megaparsec.Lexer.Tibetan
( parseNumber
, readBo
) where
import Data.Void
import Data.Composition
import Data.Either.Combinators
import qualified Data.Text as T
import Text.Megaparsec
import Text.Megaparsec.Char
import System.Environment
import Text.Megaparsec.Char.Tibetan
readBo :: (Integral a) => String -> Maybe a
readBo = fmap fromIntegral . rightToMaybe . (runParser (parseNumber :: Parser Integer) "")
readBoV :: (Integral a) => String -> Either (ParseError Char Void) a
readBoV = fmap fromIntegral . (runParser (parseNumber :: Parser Integer) "")
parseNumber :: (Integral a, MonadParsec e s m, Token s ~ Char) => m a
parseNumber = do
digits <- reverse <$> some parseNumeral
(pure . (`div` 10) $ foldr ((*10) .* (+)) 0 digits) <?> "tibetan integer"
parseNumeral :: (Integral a, MonadParsec e s m, Token s ~ Char) => m a
parseNumeral = foldr (<|>) (parseDigit '༠' 0) $ zipWith parseDigit "༠༡༢༣༤༥༦༧༨༩" (0:[1..9])
parseDigit :: (Integral a, MonadParsec e s m, Token s ~ Char) => Char -> a -> m a
parseDigit c i = do
char c
pure i