packages feed

national-australia-bank 0.0.5 → 0.0.6

raw patch · 3 files changed

+54/−5 lines, 3 files

Files

changelog.md view
@@ -1,3 +1,9 @@+0.0.6++* Fix bug in `realAmount`+* Add `integralAmount`+* Add instances for `Semigroup` and `Monoid`+ 0.0.5  * Add `encodeTransactionNoEmptyField`
national-australia-bank.cabal view
@@ -1,5 +1,5 @@ name:                 national-australia-bank-version:              0.0.5+version:              0.0.6 synopsis:             Functions for National Australia Bank transactions description:          Parsing, Processing and other functions for National Australia Bank transactions license:              BSD3
src/Data/Bank/NationalAustraliaBank/NationalAustraliaBank.hs view
@@ -5,7 +5,7 @@ module Data.Bank.NationalAustraliaBank.NationalAustraliaBank where  import Control.Applicative (Alternative((<|>)))-import Control.Lens( Lens', Prism', prism', (#), view )+import Control.Lens( Lens', Prism', prism', (#), view, preview, over, _2 ) import Control.Monad.IO.Class ( MonadIO(..) ) import Control.Monad.Reader.Class ( MonadReader ) import Control.Monad.Trans.Except ( ExceptT(..) )@@ -24,6 +24,7 @@       DecDigit(DecDigit0) ) import Data.Foldable ( asum, toList ) import Data.List.NonEmpty ( NonEmpty(..), some1 )+import Data.Maybe( fromMaybe ) import Data.Ord( comparing ) import Data.String ( IsString(fromString) ) import Data.Sv@@ -52,6 +53,9 @@       ParsecT,       Stream ) +-- #setup+-- >>> import Data.Digit+ data Month =   Jan   | Feb@@ -444,10 +448,49 @@   Integral a =>   Amount   -> Ratio a-realAmount (Amount n ds d1 d2) =+realAmount a =+  integralAmount100 a % 100++integralAmount100 ::+  Integral a =>+  Amount+  -> a+integralAmount100 (Amount n ds d1 d2) =   let neg =-        if n then Left else Right-  in  (decDigitsIntegral (neg ds) * 100 + decDigitsIntegral (Right (d1 :| [d2]))) % 100+        if n then (-1) else 1+  in  neg * (decDigitsIntegral (Right ds) * 100 + decDigitsIntegral (Right (d1 :| [d2])))++-- |+--+-- >>> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0 <> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0+-- Amount {_negated = False, _dollars = DecDigit2 :| [], _cents1 = DecDigit0, _cents2 = DecDigit0}+--+-- >>> Amount True (DecDigit1 :| []) DecDigit0 DecDigit0 <> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0+-- Amount {_negated = False, _dollars = DecDigit0 :| [], _cents1 = DecDigit0, _cents2 = DecDigit0}+--+-- >>> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0 <> Amount True (DecDigit1 :| []) DecDigit0 DecDigit0+-- Amount {_negated = False, _dollars = DecDigit0 :| [], _cents1 = DecDigit0, _cents2 = DecDigit0}+--+-- >>> Amount True (DecDigit1 :| [DecDigit2]) DecDigit5 DecDigit9 <> Amount True (DecDigit9 :| []) DecDigit7 DecDigit3+-- Amount {_negated = True, _dollars = DecDigit2 :| [DecDigit2], _cents1 = DecDigit3, _cents2 = DecDigit2}+--+-- >>> Amount False (DecDigit1 :| [DecDigit2]) DecDigit5 DecDigit9 <> Amount True (DecDigit9 :| []) DecDigit7 DecDigit3+-- Amount {_negated = False, _dollars = DecDigit2 :| [], _cents1 = DecDigit8, _cents2 = DecDigit6}+--+-- >>> Amount False (DecDigit1 :| [DecDigit2]) DecDigit5 DecDigit9 <> Amount False (DecDigit9 :| []) DecDigit7 DecDigit3+-- Amount {_negated = False, _dollars = DecDigit2 :| [DecDigit2], _cents1 = DecDigit3, _cents2 = DecDigit2}+instance Semigroup Amount where+  a1 <> a2 =+    let div10 x = over _2 (fromMaybe DecDigit0 . preview integralDecimal) (divMod x 10)+        v :: Integer+        v = integralAmount100 a1 + integralAmount100 a2+        (as1, c2) = div10 (abs v)+        (as2, c1) = div10 as1+    in  Amount (v < 0) (either id id (integralDecDigits as2)) c1 c2++instance Monoid Amount where+  mempty =+    Amount False (DecDigit0 :| []) DecDigit0 DecDigit0  data Transaction =   Transaction {