national-australia-bank 0.0.5 → 0.0.6
raw patch · 3 files changed
+54/−5 lines, 3 files
Files
- changelog.md +6/−0
- national-australia-bank.cabal +1/−1
- src/Data/Bank/NationalAustraliaBank/NationalAustraliaBank.hs +47/−4
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 {