{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ConstraintKinds #-} module Data.Digit.Octal( OctalNoZero , Octal , parseOctalNoZero , parseOctal , OctalNoZeroDigit , OctalNoZeroDigit' , OctalDigit , OctalDigit' ) where import Papa import Data.Void(Void) 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) -- $setup -- >>> import Text.Parsec(parse, ParseError, eof) -- >>> import Data.Void(Void) type OctalNoZero d = (D1 d, D2 d, D3 d, D4 d, D5 d, D6 d, D7 d) -- | -- -- >>> parse (parseOctalNoZero <* eof) "test" "1" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctalNoZero "test" "1xyz" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctalNoZero <* eof) "test" "2" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctalNoZero "test" "2xyz" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctalNoZero <* eof) "test" "3" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctalNoZero "test" "3xyz" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctalNoZero <* eof) "test" "4" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctalNoZero "test" "4xyz" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctalNoZero <* eof) "test" "5" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctalNoZero "test" "5xyz" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctalNoZero <* eof) "test" "6" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctalNoZero "test" "6xyz" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctalNoZero <* eof) "test" "7" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctalNoZero "test" "7xyz" :: Either ParseError (OctalNoZeroDigit' ()) -- Right (Left ()) -- -- >>> isn't _Right (parse parseOctalNoZero "test" "xyz" :: Either ParseError (OctalNoZeroDigit' ())) -- True -- -- prop> \c -> (c `notElem` "1234567") ==> isn't _Right (parse parseOctalNoZero "test" [c] :: Either ParseError (OctalNoZeroDigit' ())) parseOctalNoZero :: (OctalNoZero d, CharParsing p) => p d parseOctalNoZero = choice [ parse1 , parse2 , parse3 , parse4 , parse5 , parse6 , parse7 ] <?> "OctalNoZero" type OctalNoZeroDigit d1 d2 d3 d4 d5 d6 d7 = Either d1 (Either d2 (Either d3 (Either d4 (Either d5 (Either d5 (Either d6 (Either d7 Void))))))) type OctalNoZeroDigit' d = OctalNoZeroDigit d d d d d d d type Octal d = (D0 d, OctalNoZero d) -- | -- -- >>> parse (parseOctal <* eof) "test" "0" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "1xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctal <* eof) "test" "0" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "1xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctal <* eof) "test" "2" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "2xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctal <* eof) "test" "3" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "3xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctal <* eof) "test" "4" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "4xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctal <* eof) "test" "5" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "5xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctal <* eof) "test" "6" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "6xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse (parseOctal <* eof) "test" "7" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> parse parseOctal "test" "7xyz" :: Either ParseError (OctalDigit' ()) -- Right (Left ()) -- -- >>> isn't _Right (parse parseOctal "test" "xyz" :: Either ParseError (OctalDigit' ())) -- True -- -- prop> \c -> (c `notElem` "01234567") ==> isn't _Right (parse parseOctal "test" [c] :: Either ParseError (OctalDigit' ())) parseOctal :: (Octal d, CharParsing p) => p d parseOctal = choice [ parse0 , parseOctalNoZero ] <?> "Octal" type OctalDigit d0 d1 d2 d3 d4 d5 d6 d7 = Either d0 (OctalNoZeroDigit d1 d2 d3 d4 d5 d6 d7) type OctalDigit' d = OctalDigit d d d d d d d d