packages feed

digit 0.5.1 → 0.5.2

raw patch · 5 files changed

+302/−148 lines, 5 filesdep +scientificdep ~basedep ~tastydep ~tasty-hedgehogPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: scientific

Dependency ranges changed: base, tasty, tasty-hedgehog, tasty-hunit

API changes (from Hackage documentation)

+ Data.Digit.Natural: _NaturalDigits :: Prism' (NonEmpty Digit) Natural
+ Data.Digit.Natural: digitsToNatural :: NonEmpty Digit -> Maybe Natural
+ Data.Digit.Natural: naturalToDigits :: Natural -> NonEmpty Digit
- Data.Digit.D0: class D0 d where x0 = d0 # ()
+ Data.Digit.D0: class D0 d
- Data.Digit.D1: class D1 d where x1 = d1 # ()
+ Data.Digit.D1: class D1 d
- Data.Digit.D2: class D2 d where x2 = d2 # ()
+ Data.Digit.D2: class D2 d
- Data.Digit.D3: class D3 d where x3 = d3 # ()
+ Data.Digit.D3: class D3 d
- Data.Digit.D4: class D4 d where x4 = d4 # ()
+ Data.Digit.D4: class D4 d
- Data.Digit.D5: class D5 d where x5 = d5 # ()
+ Data.Digit.D5: class D5 d
- Data.Digit.D6: class D6 d where x6 = d6 # ()
+ Data.Digit.D6: class D6 d
- Data.Digit.D7: class D7 d where x7 = d7 # ()
+ Data.Digit.D7: class D7 d
- Data.Digit.D8: class D8 d where x8 = d8 # ()
+ Data.Digit.D8: class D8 d
- Data.Digit.D9: class D9 d where x9 = d9 # ()
+ Data.Digit.D9: class D9 d
- Data.Digit.DA: class DA d where xA = dA # ()
+ Data.Digit.DA: class DA d
- Data.Digit.DB: class DB d where xB = dB # ()
+ Data.Digit.DB: class DB d
- Data.Digit.DC: class DC d where xC = dC # ()
+ Data.Digit.DC: class DC d
- Data.Digit.DD: class DD d where xD = dD # ()
+ Data.Digit.DD: class DD d
- Data.Digit.DE: class DE d where xE = dE # ()
+ Data.Digit.DE: class DE d
- Data.Digit.DF: class DF d where xF = dF # ()
+ Data.Digit.DF: class DF d
- Data.Digit.Da: class Da d where xa = da # ()
+ Data.Digit.Da: class Da d
- Data.Digit.Db: class Db d where xb = db # ()
+ Data.Digit.Db: class Db d
- Data.Digit.Dc: class Dc d where xc = dc # ()
+ Data.Digit.Dc: class Dc d
- Data.Digit.Dd: class Dd d where xd = dd # ()
+ Data.Digit.Dd: class Dd d
- Data.Digit.De: class De d where xe = de # ()
+ Data.Digit.De: class De d
- Data.Digit.Df: class Df d where xf = df # ()
+ Data.Digit.Df: class Df d

Files

changelog.md view
@@ -1,3 +1,11 @@+0.5.2++* Add `Data.Digit.Natural (_NaturalDigits, naturalToDigits, digitsToNatural)`++0.5.1++* Replace doctest with hunit and hedgehog via tasty+ 0.5.0  * Data types for other bases (binary, octal, hexadecimal).
digit.cabal view
@@ -1,17 +1,17 @@ name:               digit-version:            0.5.1+version:            0.5.2 license:            BSD3 license-file:       LICENCE author:             Queensland Functional Programming Lab <oᴉ˙ldɟb@llǝʞsɐɥ> maintainer:         Queensland Functional Programming Lab <oᴉ˙ldɟb@llǝʞsɐɥ> copyright:          Copyright (C) 2010-2016 NICTA Limited-copyright:          Copyright (c) 2017, Commonwealth Scientific and Industrial Research Organisation (CSIRO) ABN 41 687 119 230.+                    Copyright (c) 2017, Commonwealth Scientific and Industrial Research Organisation (CSIRO) ABN 41 687 119 230. synopsis:           A data-type representing digits 0-9 and other combinations category:           Data homepage:           https://github.com/qfpl/digit bug-reports:        https://github.com/qfpl/digit/issues cabal-version:      >= 1.10-build-type:         Custom+build-type:         Simple extra-source-files: CONTRIBUTORS, changelog.md description:   <<http://i.imgur.com/uZnp9ke.png>>@@ -22,9 +22,6 @@   type:             git   location:         git@github.com:qfpl/digit.git -flag                small_base-  description:      Choose the new, split-up base package.- library   default-language:                     Haskell2010@@ -37,11 +34,12 @@                     , template-haskell >= 2.8 && < 3                     , papa             >= 0.3 && < 0.4                     , semigroupoids    >= 5 && < 6+                    , scientific       >= 0.3 && < 0.4    ghc-options:                     -Wall-                    -  default-extensions: ++  default-extensions:                     NoImplicitPrelude    hs-source-dirs:@@ -50,6 +48,7 @@   exposed-modules:                     Data.Digit                     Data.Digit.Binary+                    Data.Digit.Natural                     Data.Digit.Decimal                     Data.Digit.Octal                     Data.Digit.Hexadecimal@@ -99,26 +98,26 @@                     Haskell2010    build-depends:-                    base             >=4.9    && <4.10+                    base             >=4.9    && <4.12                     , lens           >=4.0    && <5                     , ansi-wl-pprint >=0.6    && <0.7                     , hedgehog       >=0.5    && <0.6-                    , tasty          >=0.11   && <0.12+                    , tasty          >=0.11   && <1.1                     , tasty-hspec    >=1.1    && <1.2                     , papa           >=0.3    && <0.4                     , parsec         >=3.1    && <3.2                     , parsers        >=0.12.3 && <0.13                     , pretty         >=1.1    && <1.2                     , text           >=1.2    && <1.3-                    , tasty-hedgehog >=0.1    && <0.2-                    , tasty-hunit    >=0.9    && <0.10+                    , tasty-hedgehog >=0.1    && <0.3+                    , tasty-hunit    >=0.9    && <0.11                     , digit    ghc-options:                     -Wall                     -threaded -  default-extensions: +  default-extensions:                     NoImplicitPrelude    hs-source-dirs:
src/Data/Digit.hs view
@@ -6,6 +6,7 @@  import Data.Digit.Binary as D import Data.Digit.Decimal as D+import Data.Digit.Natural as D import Data.Digit.Octal as D import Data.Digit.Hexadecimal as D import Data.Digit.HeXaDeCiMaL as D
+ src/Data/Digit/Natural.hs view
@@ -0,0 +1,125 @@+module Data.Digit.Natural+  ( _NaturalDigits+  , naturalToDigits+  , digitsToNatural+  ) where++import           Prelude             (Int, error, fromIntegral, maxBound, (*),+                                      (+), (-), (>), (^))++import           Control.Category    ((.))+import           Control.Lens        (Prism', ifoldrM, prism', ( # ))++import           Data.Foldable       (length)+import           Data.Function       (($))+import           Data.Functor        (fmap, (<$>))+import           Data.Semigroup      ((<>))++import           Data.List           (replicate)++import           Data.List.NonEmpty  (NonEmpty ((:|)))+import qualified Data.List.NonEmpty  as NE++import           Data.Maybe          (Maybe (..))++import           Data.Digit.Digit+import           Data.Digit.Integral (integralDecimal)++import           Numeric.Natural     (Natural)++import           Data.Scientific     (toDecimalDigits)++-- |+--+-- >>> _NaturalDigits # 0+-- 0 :| []+--+-- >>> _NaturalDigits # 1+-- 1 :| []+--+-- >>> _NaturalDigits # 9223372036854775807+-- 9 :| [2,2,3,3,7,2,0,3,6,8,5,4,7,7,5,8,0,7]+--+-- >>> (9 :| [2,2,3,3,7,2,0,3,6,8,5,4,7,7,5,8,0,7]) ^? _NaturalDigits+-- Just 9223372036854775807+--+-- >>> (1 :| []) ^? _NaturalDigits+-- Just 1+--+-- prop> \x -> digitsToNatural ( naturalToDigits x ) == Just x+--+_NaturalDigits :: Prism' (NonEmpty Digit) Natural+_NaturalDigits = prism' naturalToDigits digitsToNatural++-- | NonEmpty Digits from a Natural number+--+-- >>> naturalDigits 0+-- 0 :| []+--+-- >>> naturalDigits 9+-- 9 :| []+--+-- >>> naturalDigits 393564+-- 3 :| [9,3,5,6,4]+--+-- >>> naturalDigits 9223372036854775807+-- 9 :| [2,2,3,3,7,2,0,3,6,8,5,4,7,7,5,8,0,7]+--+naturalToDigits :: Natural -> NonEmpty Digit+naturalToDigits n =+  case toDecimalDigits $ fromIntegral n of+    -- toDecimalDigits :: n -> ([n],n)+    -- toDecimalDigits 0    = ([0],0)+    -- toDecimalDigits (-0) = ([0],0)+    -- toDecimalDigits (-1) = ([-1],1)+    ([],   _  ) -> error "Data.Scientific.toDecimalDigits is no longer correct!"+    (x:xs, eXP) -> g x :| (g <$> xs) <> t (x:xs) eXP++  where+    t allDigs eXP =+      replicate (eXP - length allDigs) Digit0++    -- EWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!+    -- But you can't reach this point unless you have a non-zero absolute integral value. So... I dunno.+    g 0 = Digit0+    g 1 = Digit1+    g 2 = Digit2+    g 3 = Digit3+    g 4 = Digit4+    g 5 = Digit5+    g 6 = Digit6+    g 7 = Digit7+    g 8 = Digit8+    g 9 = Digit9+    g _ = error "The universe now has more than ten digits."++-- | Create a number from a list of digits with the integer bounds of the machine.+--+-- >>> naturalFromDigits (D.x3 :| [D.x4])+-- Just 34+--+-- >>> naturalFromDigits (D.Digit3 :| [D.Digit9,D.Digit3,D.Digit5,D.Digit6,D.Digit4])+-- Just 393564+--+-- >>> naturalFromDigits (D.x0 :| [])+-- Just 0+--+-- Int maxBound for Int64+-- >>> naturalFromDigits (D.x9 :| [D.x2,D.x2,D.x3,D.x3,D.x7,D.x2,D.x0,D.x3,D.x6,D.x8,D.x5,D.x4,D.x7,D.x7,D.x5,D.x8,D.x0,D.x7])+-- Just 9223372036854775807+--+-- Int maxBound + 1 for Int64+-- >>> naturalFromDigits (D.x9 :| [D.x2,D.x2,D.x3,D.x3,D.x7,D.x2,D.x0,D.x3,D.x6,D.x8,D.x5,D.x4,D.x7,D.x7,D.x5,D.x8,D.x0,D.x8])+-- Nothing+--+digitsToNatural :: NonEmpty Digit -> Maybe Natural+digitsToNatural = fmap fromIntegral . ifoldrM f 0 . NE.reverse+  where+    f :: Int -> Digit -> Int -> Maybe Int+    f i d curr =+      let+        next = (integralDecimal # d) * (10 ^ i)+      in+        if curr > maxBound - next+        then Nothing+        else Just (curr + next)
test/Main.hs view
@@ -5,8 +5,10 @@ ) where  import Data.Digit+import Numeric.Natural (Natural)+import Prelude (maxBound) import Papa hiding (re)-import Hedgehog(Gen, forAll, property, assert, (===))+import Hedgehog(Property, Gen, forAll, property, assert, (===)) import Test.Tasty(TestTree, defaultMain, testGroup) import Test.Tasty.Hedgehog(testProperty) import Test.Tasty.HUnit(testCase, (@?=))@@ -69,7 +71,7 @@                 n'                 ((parse p (n' ++ "test") (c:"xyz") :: Either ParseError Digit) @?= Right d)             ]-    ) +    )  integralPrism ::   (Show n, Integral n) =>@@ -79,7 +81,7 @@   -> [TestTree] integralPrism =   testPrism (Gen.choice [Gen.integral (Range.linear 0 9), Gen.integral (Range.linear 10 99999), Gen.integral (Range.linear (-1) (-99999))])-  + charPrism ::   String   -> Prism' Char Digit@@ -88,137 +90,156 @@ charPrism =   testPrism (Gen.choice [Gen.hexit, Gen.unicode]) +genNatural :: Gen Natural+genNatural = fromIntegral <$> Gen.integral (Range.linear 0 (maxBound :: Int))++prop_natural_digits_roundtrip :: Property+prop_natural_digits_roundtrip = property $ do+  n <- forAll genNatural+  digitsToNatural (naturalToDigits n) === Just n++digitNaturalTests :: TestTree+digitNaturalTests = testGroup "digit Natural tests"+  [ testProperty "Natural <-> NonEmpty Digit" prop_natural_digits_roundtrip+  ]+ main ::   IO ()-main =-  defaultMain $-    testGroup "digit tests" $-      let q0  = ('0', Digit0)-          q1  = ('1', Digit1)-          q2  = ('2', Digit2)-          q3  = ('3', Digit3)-          q4  = ('4', Digit4)-          q5  = ('5', Digit5)-          q6  = ('6', Digit6)-          q7  = ('7', Digit7)-          q8  = ('8', Digit8)-          q9  = ('9', Digit9)-          qa  = ('a', Digita)-          qb  = ('b', Digitb)-          qc  = ('c', Digitc)-          qd  = ('d', Digitd)-          qe  = ('e', Digite)-          qf  = ('f', Digitf)-          qA  = ('A', DigitA)-          qB  = ('B', DigitB)-          qC  = ('C', DigitC)-          qD  = ('D', DigitD)-          qE  = ('E', DigitE)-          qF  = ('F', DigitF)-          r0 :: (Integer, Digit)-          r0  = (0  , Digit0)-          r1 :: (Integer, Digit)-          r1  = (1  , Digit1)-          r2 :: (Integer, Digit)-          r2  = (2  , Digit2)-          r3 :: (Integer, Digit)-          r3  = (3  , Digit3)-          r4 :: (Integer, Digit)-          r4  = (4  , Digit4)-          r5 :: (Integer, Digit)-          r5  = (5  , Digit5)-          r6 :: (Integer, Digit)-          r6  = (6  , Digit6)-          r7 :: (Integer, Digit)-          r7  = (7  , Digit7)-          r8 :: (Integer, Digit)-          r8  = (8  , Digit8)-          r9 :: (Integer, Digit)-          r9  = (9  , Digit9)-          ra :: (Integer, Digit)-          ra =  (10 , Digita)-          rb :: (Integer, Digit)-          rb =  (11 , Digitb)-          rc :: (Integer, Digit)-          rc =  (12 , Digitc)-          rd :: (Integer, Digit)-          rd =  (13 , Digitd)-          re :: (Integer, Digit)-          re =  (14 , Digite)-          rf :: (Integer, Digit)-          rf =  (15 , Digitf)-          rA :: (Integer, Digit)-          rA =  (10 , DigitA)-          rB :: (Integer, Digit)-          rB =  (11 , DigitB)-          rC :: (Integer, Digit)-          rC =  (12 , DigitC)-          rD :: (Integer, Digit)-          rD =  (13 , DigitD)-          rE :: (Integer, Digit)-          rE =  (14 , DigitE)-          rF :: (Integer, Digit)-          rF =  (15 , DigitF)-      in  concat [-            charPrism "charBinaryNoZero" charBinaryNoZero [q1]-          , charPrism "charBinary" charBinary [q0, q1]-          , charPrism "charOctalNoZero" charOctalNoZero [q1, q2, q3, q4, q5, q6, q7]-          , charPrism "charOctal" charOctal [q0, q1, q2, q3, q4, q5, q6, q7]-          , charPrism "charDecimalNoZero" charDecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9]-          , charPrism "charDecimal" charDecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9]-          , charPrism "charHexadecimalNoZero" charHexadecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]-          , charPrism "charHexadecimal" charHexadecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]-          , charPrism "charHEXADECIMALNoZero" charHEXADECIMALNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]-          , charPrism "charHEXADECIMAL" charHEXADECIMAL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]-          , charPrism "charHeXaDeCiMaLNoZero" charHeXaDeCiMaLNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]-          , charPrism "charHeXaDeCiMaL" charHeXaDeCiMaL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]-          , integralPrism "integralBinaryNoZero" integralBinaryNoZero [r1]-          , integralPrism "integralBinary" integralBinary [r0, r1]-          , integralPrism "integralOctalNoZero" integralOctalNoZero [r1, r2, r3, r4, r5, r6, r7]-          , integralPrism "integralOctal" integralOctal [r0, r1, r2, r3, r4, r5, r6, r7]-          , integralPrism "integralDecimalNoZero" integralDecimalNoZero [r1, r2, r3, r4, r5, r6, r7, r8, r9]-          , integralPrism "integralDecimal" integralDecimal [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9]-          , integralPrism "integralHexadecimalNoZero" integralHexadecimalNoZero [r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf]-          , integralPrism "integralHexadecimal" integralHexadecimal [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf]-          , integralPrism "integralHEXADECIMALNoZero" integralHEXADECIMALNoZero [r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF]-          , integralPrism "integralHEXADECIMAL" integralHEXADECIMAL [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF] , testParser "parseBinaryNoZero" parseBinaryNoZero [q1]-          , testParser "parseBinary" parseBinary [q0, q1]-          , testParser "parseOctalNoZero" parseOctalNoZero [q1, q2, q3, q4, q5, q6, q7]-          , testParser "parseOctal" parseOctal [q0, q1, q2, q3, q4, q5, q6, q7]-          , testParser "parseDecimalNoZero" parseDecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9]-          , testParser "parseDecimal" parseDecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9]-          , testParser "parseHexadecimalNoZero" parseHexadecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]-          , testParser "parseHexadecimal" parseHexadecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]-          , testParser "parseHEXADECIMALNoZero" parseHEXADECIMALNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]-          , testParser "parseHEXADECIMALDecimal" parseHEXADECIMAL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]-          , testParser "parseHeXaDeCiMaLNoZero" parseHeXaDeCiMaLNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]-          , testParser "parseHeXaDeCiMaLDecimal" parseHeXaDeCiMaL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]-          , testParser "parse0" parse0 [q0]-          , testParser "parse1" parse1 [q1]-          , testParser "parse2" parse2 [q2]-          , testParser "parse3" parse3 [q3]-          , testParser "parse4" parse4 [q4]-          , testParser "parse5" parse5 [q5]-          , testParser "parse6" parse6 [q6]-          , testParser "parse7" parse7 [q7]-          , testParser "parse8" parse8 [q8]-          , testParser "parse9" parse9 [q9]-          , testParser "parsea" parsea [qa]-          , testParser "parseb" parseb [qb]-          , testParser "parsec" parsec [qc]-          , testParser "parsed" parsed [qd]-          , testParser "parsee" parsee [qe]-          , testParser "parsef" parsef [qf]-          , testParser "parseA" parseA [qA]-          , testParser "parseB" parseB [qB]-          , testParser "parseC" parseC [qC]-          , testParser "parseD" parseD [qD]-          , testParser "parseE" parseE [qE]-          , testParser "parseF" parseF [qF]-          , testParser "parseAa" parseAa [qA, qa]-          , testParser "parseBb" parseBb [qB, qb]-          , testParser "parseCc" parseCc [qC, qc]-          , testParser "parseDd" parseDd [qD, qd]-          , testParser "parseEe" parseEe [qE, qe]-          , testParser "parseFf" parseFf [qF, qf]-          ]+main = defaultMain $+  testGroup "All Digit Tests"+    [ digitBaseTests+    , digitNaturalTests+    ]++digitBaseTests :: TestTree+digitBaseTests =+  testGroup "digit parser/prism tests" $+    let q0  = ('0', Digit0)+        q1  = ('1', Digit1)+        q2  = ('2', Digit2)+        q3  = ('3', Digit3)+        q4  = ('4', Digit4)+        q5  = ('5', Digit5)+        q6  = ('6', Digit6)+        q7  = ('7', Digit7)+        q8  = ('8', Digit8)+        q9  = ('9', Digit9)+        qa  = ('a', Digita)+        qb  = ('b', Digitb)+        qc  = ('c', Digitc)+        qd  = ('d', Digitd)+        qe  = ('e', Digite)+        qf  = ('f', Digitf)+        qA  = ('A', DigitA)+        qB  = ('B', DigitB)+        qC  = ('C', DigitC)+        qD  = ('D', DigitD)+        qE  = ('E', DigitE)+        qF  = ('F', DigitF)+        r0 :: (Integer, Digit)+        r0  = (0  , Digit0)+        r1 :: (Integer, Digit)+        r1  = (1  , Digit1)+        r2 :: (Integer, Digit)+        r2  = (2  , Digit2)+        r3 :: (Integer, Digit)+        r3  = (3  , Digit3)+        r4 :: (Integer, Digit)+        r4  = (4  , Digit4)+        r5 :: (Integer, Digit)+        r5  = (5  , Digit5)+        r6 :: (Integer, Digit)+        r6  = (6  , Digit6)+        r7 :: (Integer, Digit)+        r7  = (7  , Digit7)+        r8 :: (Integer, Digit)+        r8  = (8  , Digit8)+        r9 :: (Integer, Digit)+        r9  = (9  , Digit9)+        ra :: (Integer, Digit)+        ra =  (10 , Digita)+        rb :: (Integer, Digit)+        rb =  (11 , Digitb)+        rc :: (Integer, Digit)+        rc =  (12 , Digitc)+        rd :: (Integer, Digit)+        rd =  (13 , Digitd)+        re :: (Integer, Digit)+        re =  (14 , Digite)+        rf :: (Integer, Digit)+        rf =  (15 , Digitf)+        rA :: (Integer, Digit)+        rA =  (10 , DigitA)+        rB :: (Integer, Digit)+        rB =  (11 , DigitB)+        rC :: (Integer, Digit)+        rC =  (12 , DigitC)+        rD :: (Integer, Digit)+        rD =  (13 , DigitD)+        rE :: (Integer, Digit)+        rE =  (14 , DigitE)+        rF :: (Integer, Digit)+        rF =  (15 , DigitF)+    in  concat [+          charPrism "charBinaryNoZero" charBinaryNoZero [q1]+        , charPrism "charBinary" charBinary [q0, q1]+        , charPrism "charOctalNoZero" charOctalNoZero [q1, q2, q3, q4, q5, q6, q7]+        , charPrism "charOctal" charOctal [q0, q1, q2, q3, q4, q5, q6, q7]+        , charPrism "charDecimalNoZero" charDecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9]+        , charPrism "charDecimal" charDecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9]+        , charPrism "charHexadecimalNoZero" charHexadecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]+        , charPrism "charHexadecimal" charHexadecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]+        , charPrism "charHEXADECIMALNoZero" charHEXADECIMALNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]+        , charPrism "charHEXADECIMAL" charHEXADECIMAL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]+        , charPrism "charHeXaDeCiMaLNoZero" charHeXaDeCiMaLNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]+        , charPrism "charHeXaDeCiMaL" charHeXaDeCiMaL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]+        , integralPrism "integralBinaryNoZero" integralBinaryNoZero [r1]+        , integralPrism "integralBinary" integralBinary [r0, r1]+        , integralPrism "integralOctalNoZero" integralOctalNoZero [r1, r2, r3, r4, r5, r6, r7]+        , integralPrism "integralOctal" integralOctal [r0, r1, r2, r3, r4, r5, r6, r7]+        , integralPrism "integralDecimalNoZero" integralDecimalNoZero [r1, r2, r3, r4, r5, r6, r7, r8, r9]+        , integralPrism "integralDecimal" integralDecimal [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9]+        , integralPrism "integralHexadecimalNoZero" integralHexadecimalNoZero [r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf]+        , integralPrism "integralHexadecimal" integralHexadecimal [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf]+        , integralPrism "integralHEXADECIMALNoZero" integralHEXADECIMALNoZero [r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF]+        , integralPrism "integralHEXADECIMAL" integralHEXADECIMAL [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF] , testParser "parseBinaryNoZero" parseBinaryNoZero [q1]+        , testParser "parseBinary" parseBinary [q0, q1]+        , testParser "parseOctalNoZero" parseOctalNoZero [q1, q2, q3, q4, q5, q6, q7]+        , testParser "parseOctal" parseOctal [q0, q1, q2, q3, q4, q5, q6, q7]+        , testParser "parseDecimalNoZero" parseDecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9]+        , testParser "parseDecimal" parseDecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9]+        , testParser "parseHexadecimalNoZero" parseHexadecimalNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]+        , testParser "parseHexadecimal" parseHexadecimal [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf]+        , testParser "parseHEXADECIMALNoZero" parseHEXADECIMALNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]+        , testParser "parseHEXADECIMALDecimal" parseHEXADECIMAL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qA, qB, qC, qD, qE, qF]+        , testParser "parseHeXaDeCiMaLNoZero" parseHeXaDeCiMaLNoZero [q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]+        , testParser "parseHeXaDeCiMaLDecimal" parseHeXaDeCiMaL [q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe, qf, qA, qB, qC, qD, qE, qF]+        , testParser "parse0" parse0 [q0]+        , testParser "parse1" parse1 [q1]+        , testParser "parse2" parse2 [q2]+        , testParser "parse3" parse3 [q3]+        , testParser "parse4" parse4 [q4]+        , testParser "parse5" parse5 [q5]+        , testParser "parse6" parse6 [q6]+        , testParser "parse7" parse7 [q7]+        , testParser "parse8" parse8 [q8]+        , testParser "parse9" parse9 [q9]+        , testParser "parsea" parsea [qa]+        , testParser "parseb" parseb [qb]+        , testParser "parsec" parsec [qc]+        , testParser "parsed" parsed [qd]+        , testParser "parsee" parsee [qe]+        , testParser "parsef" parsef [qf]+        , testParser "parseA" parseA [qA]+        , testParser "parseB" parseB [qB]+        , testParser "parseC" parseC [qC]+        , testParser "parseD" parseD [qD]+        , testParser "parseE" parseE [qE]+        , testParser "parseF" parseF [qF]+        , testParser "parseAa" parseAa [qA, qa]+        , testParser "parseBb" parseBb [qB, qb]+        , testParser "parseCc" parseCc [qC, qc]+        , testParser "parseDd" parseDd [qD, qd]+        , testParser "parseEe" parseEe [qE, qe]+        , testParser "parseFf" parseFf [qF, qf]+        ]