packages feed

digit 0.2.1 → 0.2.2

raw patch · 3 files changed

+173/−16 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Data.Digit: digits :: Prism' Int [Digit]
+ Data.Digit: divMod10 :: Int -> (Int, Digit)
+ Data.Digit: mod10 :: Int -> Digit

Files

digit.cabal view
@@ -1,5 +1,5 @@ name:               digit-version:            0.2.1+version:            0.2.2 license:            BSD3 license-File:       etc/LICENCE author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
etc/changelog view
@@ -1,3 +1,9 @@+0.2.2++* Modulus operations.+* `digits` function.+* Fix tests.+ 0.2.1  * Include digit parsers.
src/Data/Digit.hs view
@@ -33,6 +33,10 @@ , x9 , digit , digitC+, digits+-- * mod operations+, mod10+, divMod10 -- * Parsers , parseDigit -- * Quasi-Quoters@@ -45,16 +49,17 @@ import Control.Monad(Monad(fail)) import Data.Char(Char) import Data.Data (Data)-import Data.Eq(Eq)+import Data.Eq(Eq((==)))+import Data.Foldable(foldl') import Data.Function(const) import Data.Int(Int)-import Data.List((++))-import Data.Maybe(Maybe(Nothing, Just), maybe)-import Data.Ord(Ord)+import Data.List((++), unfoldr, reverse)+import Data.Maybe(Maybe(Nothing, Just), maybe, fromMaybe)+import Data.Ord(Ord((<))) import Data.Typeable (Typeable) import Language.Haskell.TH(ExpQ, PatQ, varE, varP, mkName) import Language.Haskell.TH.Quote(QuasiQuoter(QuasiQuoter), quotePat, quoteExp, quoteDec, dataToExpQ, dataToPatQ, quoteType)-import Prelude(Show(..), Read(..), Enum(..), Bounded, error)+import Prelude(Show(..), Read(..), Enum(..), Bounded, Num(..), error, divMod, mod) import Text.Parser.Char(CharParsing, anyChar) import Text.Parser.Combinators((<?>)) @@ -77,25 +82,25 @@  -- | Catamorphism for @Digit@. ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d0 == x0+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D0 == q0 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d1 == x1+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D1 == q1 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d2 == x2+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D2 == q2 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d3 == x3+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D3 == q3 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d4 == x4+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D4 == q4 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d5 == x5+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D5 == q5 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d6 == x6+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D6 == q6 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d7 == x7+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D7 == q7 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d8 == x8+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D8 == q8 ----- prop> foldDigit x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 d9 == x9+-- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D9 == q9 foldDigit ::   a -- ^ Zero.   -> a -- ^ One.@@ -346,6 +351,15 @@ -- -- >>> (-5) ^? digit -- Nothing+--+-- >>> digit # D5+-- 5+--+-- >>> digit # D9+-- 9+--+-- >>> digit # D0+-- 0 digit ::   Prism' Int Digit digit =@@ -379,6 +393,15 @@ -- -- >>> '@' ^? digitC -- Nothing+--+-- >>> digitC # D5+-- '5'+--+-- >>> digitC # D9+-- '9'+--+-- >>> digitC # D0+-- '0' digitC ::   Prism' Char Digit digitC =@@ -404,6 +427,134 @@                      '8' -> Just D8                      '9' -> Just D9                      _ -> Nothing)++-- | A prism for the list of digits in an integer+--+-- >>> 1234 ^? digits+-- Just [1,2,3,4]+-- +-- >>> 0 ^? digits+-- Just []+-- +-- >>> 1 ^? digits+-- Just [1]+-- +-- >>> 90 ^? digits+-- Just [9,0]+-- +-- >>> 05 ^? digits+-- Just [5]+-- +-- >>> 105 ^? digits+-- Just [1,0,5]+-- +-- >>> (-1) ^? digits+-- Nothing+--+-- λ> digits # [D0]+-- 0+--+-- >>> digits # [D0, D1]+-- 1+--+-- >>> digits # [D1]+-- 1+--+-- >>> digits # [D1, D2, D3]+-- 123+--+-- >>> digits # [D1, D0, D3]+-- 103+--+-- >>> digits # [D1, D0, D3, D0]+-- 1030+digits ::+  Prism'+    Int+    [Digit]+digits =+  prism'+    (foldl' (\a b -> a * 10 + digit # b) 0)+    (\i ->  if  i < 0+              then+                Nothing+              else +                Just (reverse (unfoldr (\n -> +                  let (x, r) = divMod10 n+                  in  if x == 0+                        then+                          if r == D0+                            then+                              Nothing+                            else+                              Just (r, 0)+                        else+                              Just (r, x)) i))+    )++-- | Modulus with 10.+--+-- >>> mod10 0+-- 0+--+-- >>> mod10 1+-- 1+--+-- >>> mod10 8+-- 8+--+-- >>> mod10 9+-- 9+--+-- >>> mod10 10+-- 0+--+-- >>> mod10 90+-- 0+--+-- >>> mod10 91+-- 1+--+-- >>> mod10 (-1)+-- 9+mod10 ::+  Int+  -> Digit+mod10 n =+  let r = n `mod` 10+  in fromMaybe (mod10 r) (r ^? digit)++-- | Division/modulus with 10.+--+-- λ> divMod10 0+-- (0,0)+--+-- >>> divMod10 1+-- (0,1)+--+-- >>> divMod10 8+-- (0,8)+--+-- >>> divMod10 9+-- (0,9)+--+-- >>> divMod10 10+-- (1,0)+--+-- >>> divMod10 90+-- (9,0)+--+-- >>> divMod10 91+-- (9,1)+--+-- >>> divMod10 (-1)+-- (-1,9)+divMod10 ::+  Int+  -> (Int, Digit)+divMod10 n =+  let (x, r) = n `divMod` 10+  in (x, mod10 r)  parseDigit ::   (Monad p, CharParsing p) =>