{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ConstraintKinds #-} module Data.Digit.Decimal( DecimalNoZero , Decimal , parseDecimalNoZero , parseDecimal ) where import Text.Parser.Char(CharParsing) import Text.Parser.Combinators((<?>), choice) import Data.Digit.D0(D0, parse0) import Data.Digit.D1(D1, parse1) import Data.Digit.D2(D2, parse2) import Data.Digit.D3(D3, parse3) import Data.Digit.D4(D4, parse4) import Data.Digit.D5(D5, parse5) import Data.Digit.D6(D6, parse6) import Data.Digit.D7(D7, parse7) import Data.Digit.D8(D8, parse8) import Data.Digit.D9(D9, parse9) -- $setup -- >>> import Text.Parsec(parse, ParseError, eof) -- >>> import Data.Void(Void) -- >>> import Data.Digit.Digit -- >>> import Papa type DecimalNoZero d = (D1 d, D2 d, D3 d, D4 d, D5 d, D6 d, D7 d, D8 d, D9 d) -- | -- -- >>> parse (parseDecimalNoZero <* eof) "test" "1" :: Either ParseError Digit -- Right 1 -- -- >>> parse parseDecimalNoZero "test" "1xyz" :: Either ParseError Digit -- Right 1 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "2" :: Either ParseError Digit -- Right 2 -- -- >>> parse parseDecimalNoZero "test" "2xyz" :: Either ParseError Digit -- Right 2 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "3" :: Either ParseError Digit -- Right 3 -- -- >>> parse parseDecimalNoZero "test" "3xyz" :: Either ParseError Digit -- Right 3 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "4" :: Either ParseError Digit -- Right 4 -- -- >>> parse parseDecimalNoZero "test" "4xyz" :: Either ParseError Digit -- Right 4 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "5" :: Either ParseError Digit -- Right 5 -- -- >>> parse parseDecimalNoZero "test" "5xyz" :: Either ParseError Digit -- Right 5 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "6" :: Either ParseError Digit -- Right 6 -- -- >>> parse parseDecimalNoZero "test" "6xyz" :: Either ParseError Digit -- Right 6 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "7" :: Either ParseError Digit -- Right 7 -- -- >>> parse parseDecimalNoZero "test" "7xyz" :: Either ParseError Digit -- Right 7 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "8" :: Either ParseError Digit -- Right 8 -- -- >>> parse parseDecimalNoZero "test" "8xyz" :: Either ParseError Digit -- Right 8 -- -- >>> parse (parseDecimalNoZero <* eof) "test" "9" :: Either ParseError Digit -- Right 9 -- -- >>> parse parseDecimalNoZero "test" "9xyz" :: Either ParseError Digit -- Right 9 -- -- >>> isn't _Right (parse parseDecimalNoZero "test" "xyz" :: Either ParseError Digit) -- True -- -- prop> \c -> (c `notElem` "123456789") ==> isn't _Right (parse parseDecimalNoZero "test" [c] :: Either ParseError Digit) parseDecimalNoZero :: (DecimalNoZero d, CharParsing p) => p d parseDecimalNoZero = choice [ parse1 , parse2 , parse3 , parse4 , parse5 , parse6 , parse7 , parse8 , parse9 ] <?> "DecimalNoZero" type Decimal d = (D0 d, DecimalNoZero d) -- | -- -- >>> parse (parseDecimal <* eof) "test" "0" :: Either ParseError Digit -- Right 0 -- -- >>> parse parseDecimal "test" "0xyz" :: Either ParseError Digit -- Right 0 -- -- >>> parse (parseDecimal <* eof) "test" "1" :: Either ParseError Digit -- Right 1 -- -- >>> parse parseDecimal "test" "1xyz" :: Either ParseError Digit -- Right 1 -- -- >>> parse (parseDecimal <* eof) "test" "2" :: Either ParseError Digit -- Right 2 -- -- >>> parse parseDecimal "test" "2xyz" :: Either ParseError Digit -- Right 2 -- -- >>> parse (parseDecimal <* eof) "test" "3" :: Either ParseError Digit -- Right 3 -- -- >>> parse parseDecimal "test" "3xyz" :: Either ParseError Digit -- Right 3 -- -- >>> parse (parseDecimal <* eof) "test" "4" :: Either ParseError Digit -- Right 4 -- -- >>> parse parseDecimal "test" "4xyz" :: Either ParseError Digit -- Right 4 -- -- >>> parse (parseDecimal <* eof) "test" "5" :: Either ParseError Digit -- Right 5 -- -- >>> parse parseDecimal "test" "5xyz" :: Either ParseError Digit -- Right 5 -- -- >>> parse (parseDecimal <* eof) "test" "6" :: Either ParseError Digit -- Right 6 -- -- >>> parse parseDecimal "test" "6xyz" :: Either ParseError Digit -- Right 6 -- -- >>> parse (parseDecimal <* eof) "test" "7" :: Either ParseError Digit -- Right 7 -- -- >>> parse parseDecimal "test" "7xyz" :: Either ParseError Digit -- Right 7 -- -- >>> parse (parseDecimal <* eof) "test" "8" :: Either ParseError Digit -- Right 8 -- -- >>> parse parseDecimal "test" "8xyz" :: Either ParseError Digit -- Right 8 -- -- >>> parse (parseDecimal <* eof) "test" "9" :: Either ParseError Digit -- Right 9 -- -- >>> parse parseDecimal "test" "9xyz" :: Either ParseError Digit -- Right 9 -- -- >>> isn't _Right (parse parseDecimal "test" "xyz" :: Either ParseError Digit) -- True -- -- prop> \c -> (c `notElem` "0123456789") ==> isn't _Right (parse parseDecimal "test" [c] :: Either ParseError Digit) parseDecimal :: (Decimal d, CharParsing p) => p d parseDecimal = choice [ parse0 , parseDecimalNoZero ] <?> "Decimal"