Correction : Calc.Balance : infer_equilibrium : préservation du Posting lors de l...
authorJulien Moutinho <julm+hcompta@autogeree.net>
Thu, 4 Jun 2015 15:38:24 +0000 (17:38 +0200)
committerJulien Moutinho <julm+hcompta@autogeree.net>
Thu, 4 Jun 2015 16:11:07 +0000 (18:11 +0200)
lib/Hcompta/Calc/Balance.hs
lib/Hcompta/Format/Ledger.hs
lib/Hcompta/Format/Ledger/Read.hs
lib/Test/Main.hs
lib/hcompta-lib.cabal

index 3118165e07e7236e086b51f88f1e4fd40e2d2a4c..4f1df540d75a8eab9ee87173147777a348d496c5 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE TypeFamilies #-}
 module Hcompta.Calc.Balance where
@@ -8,7 +9,6 @@ import           Control.Exception (assert)
 import           Data.Data
 import qualified Data.Foldable
 import           Data.Foldable (Foldable(..))
-import qualified Data.List
 import qualified Data.Map.Strict as Data.Map
 import           Data.Map.Strict (Map)
 import           Data.Maybe (fromMaybe)
@@ -73,15 +73,24 @@ amount_sum_negate a =
 -- | A 'posting' used to produce a 'Balance'
 --   must be an instance of this class.
 class
- ( Ord (Posting_Unit p)
- , Amount (Posting_Amount p)
+ ( Amount (Posting_Amount p)
+ , Ord    (Posting_Unit   p)
  ) =>
  Posting p where
        type Posting_Amount p
-       type Posting_Unit p
-       posting_account :: p -> Account
-       posting_amounts :: p -> Map (Posting_Unit p) (Posting_Amount p)
-       posting_make    :: Account -> Map (Posting_Unit p) (Posting_Amount p) -> p
+       type Posting_Unit   p
+       posting_account     :: p -> Account
+       posting_amounts     :: p -> Map (Posting_Unit p) (Posting_Amount p)
+       posting_set_amounts :: Map (Posting_Unit p) (Posting_Amount p) -> p -> p
+
+instance (Amount amount, Ord unit)
+ => Posting (Account, Map unit amount)
+ where
+       type Posting_Amount (Account, Map unit amount) = amount
+       type Posting_Unit   (Account, Map unit amount) = unit
+       posting_account = fst
+       posting_amounts = snd
+       posting_set_amounts amounts (acct, _) = (acct, amounts)
 
 -- * The 'Balance' type
 
@@ -260,8 +269,8 @@ infer_equilibrium ::
  -> ( Balance amount unit
     , Either [Unit_Sum amount] (Map Account [posting])
     )
-infer_equilibrium ps = do
-       let bal_initial = Data.Foldable.foldr postings balance ps
+infer_equilibrium posts = do
+       let bal_initial = Data.Foldable.foldr postings balance posts
        let Deviation dev = deviation bal_initial
        let (bal_adjusted, eithers) =
                Data.Map.foldrWithKey
@@ -269,28 +278,40 @@ infer_equilibrium ps = do
                 (bal, lr) ->
                        case Data.Map.size unit_sum_accounts of
                         1 ->
-                               let post =
-                                       posting_make
-                                        (fst $ Data.Map.elemAt 0 unit_sum_accounts)
-                                        (Data.Map.mapKeys (\() -> unit) $
-                                               amount_sum_balance $
-                                               amount_sum_negate unit_sum_amount) in
-                               ( posting post bal
-                               , Right post : lr
+                               let acct = fst $ Data.Map.elemAt 0 unit_sum_accounts in
+                               let amt = (amount_sum_balance $ amount_sum_negate unit_sum_amount) Data.Map.! () in
+                               let amts = Data.Map.singleton unit amt in
+                               ( posting (acct, amts) bal
+                               , Right (acct, unit, amt) : lr
                                )
                         _ -> (bal, Left [unit_sum] : lr))
                 (bal_initial, [])
                 dev
-       let (l, r) =
-               Lib.Foldable.accumLeftsAndFoldrRights
-                (\p -> Data.Map.insertWith
-                        (\pn -> (++) pn . Data.List.filter (not . Data.Map.null . posting_amounts))
-                        (posting_account p) [p])
-                ps
-                eithers
+       let (l, r) = Lib.Foldable.accumLeftsAndFoldrRights
+                (\(acct, unit, amt) ->
+                       Data.Map.insertWith
+                        (\_new_ps -> insert_amount (unit, amt))
+                        acct (assert False []))
+                posts eithers
        case l of
         [] -> (bal_adjusted, Right r)
         _  -> (bal_adjusted, Left  l)
+       where
+               insert_amount
+                :: Posting posting
+                => (Posting_Unit posting, Posting_Amount posting)
+                -> [posting] -> [posting]
+               insert_amount p@(unit, amt) ps =
+                       case ps of
+                        [] -> assert False []
+                        (x:xs) | Data.Map.null (posting_amounts x) ->
+                               posting_set_amounts (Data.Map.singleton unit amt) x:xs
+                               | Data.Map.notMember unit (posting_amounts x) ->
+                               let amts =
+                                       Data.Map.insertWith (assert False undefined)
+                                        unit amt (posting_amounts x) in
+                               posting_set_amounts amts x:xs
+                        (x:xs) -> x:insert_amount p xs
 
 -- | Return 'True' if and only if the given 'Deviation' maps no 'unit'.
 is_at_equilibrium :: Deviation amount unit -> Bool
@@ -333,7 +354,7 @@ data Account_Sum_Expanded amount unit
 --
 -- * and every mapped 'amount'
 -- added with any 'amount'
--- of the 'Account's for which it is 'Account.ascending'.
+-- of the 'Account's for which it is 'Account.ascending'.
 expanded ::
  ( Amount amount, Ord unit )
  => Balance_by_Account amount unit
index 8d1379dbfda45c494f8397084d8977276a27f6ed..d0f7ce76b56bc5f33282f2c447af9543fc6134b2 100644 (file)
@@ -133,7 +133,7 @@ instance Calc.Balance.Posting Posting
        type Posting_Unit   Posting = Amount.Unit
        posting_account = posting_account
        posting_amounts = posting_amounts
-       posting_make acct amounts = (posting acct) { posting_amounts=amounts }
+       posting_set_amounts amounts p = p { posting_amounts=amounts }
 
 -- ** The 'Posting' mappings
 
index 51c81b25fd8a95f51cbd6164f6000e784a6d9bf1..d0df8756ea6a2153e567ed598660e5302fc2f534 100644 (file)
@@ -608,7 +608,7 @@ amount_sep = '+'
 
 tags_of_comments :: [Comment] -> Tag_by_Name
 tags_of_comments =
-       Data.Map.unionsWith (flip (++))
+       Data.Map.unionsWith (++)
        . Data.List.map
         ( Data.Either.either (const Data.Map.empty) id
         . R.runParser (not_tag >> tags <* R.eof) () "" )
index 8a453b24b2908de3dadd9c89728afec453fbd181..e899b0fd359567d6b75908ec3c16425d48329c94 100644 (file)
@@ -23,6 +23,7 @@ import qualified Text.Parsec.Pos as P
 
 import qualified Hcompta.Model.Account as Account
 import qualified Hcompta.Model.Amount as Amount
+import           Hcompta.Model.Amount (Amount)
 import qualified Hcompta.Model.Amount.Style as Amount.Style
 import qualified Hcompta.Model.Date as Date
 import qualified Hcompta.Calc.Balance as Calc.Balance
@@ -234,9 +235,9 @@ test_Hcompta =
                                                         [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -260,9 +261,13 @@ test_Hcompta =
                                                         [ ("A":|[], Amount.from_List [ Amount.usd $ 0 ]) ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -286,14 +291,22 @@ test_Hcompta =
                                                         [ ("A":|[], Amount.from_List [ Amount.usd $ 1, Amount.eur $ -1 ]) ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.empty
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 1
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ -1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.eur $ -1
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.empty
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.eur $ -1
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -319,9 +332,13 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
@@ -347,9 +364,9 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 2
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
@@ -374,14 +391,22 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.eur $ -2
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.eur $ 2
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.eur $ 0
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -407,19 +432,31 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.eur $ -2
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.eur $ 2
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.eur $ 0
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.gbp $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.gbp $ -3
+                                                                , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.gbp $ 3
+                                                                , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.gbp $ 0
+                                                                }
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
@@ -432,7 +469,7 @@ test_Hcompta =
                                                 Calc.Balance.balance
                                                 Calc.Balance.balance
                                         ~?=
-                                        (Calc.Balance.balance::Calc.Balance.Balance Int String)
+                                        (Calc.Balance.balance::Calc.Balance.Balance Amount String)
                                 , "{A+$1, $+1} {A+$1, $+1} = {A+$2, $+2}" ~:
                                         Calc.Balance.union
                                                 (Calc.Balance.Balance
@@ -441,9 +478,9 @@ test_Hcompta =
                                                                 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
                                                         , Calc.Balance.balance_by_unit =
                                                                Data.Map.fromList $
-                                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                                [ Calc.Balance.Unit_Sum
-                                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                         ["A":|[]]
                                                                 }
@@ -455,9 +492,9 @@ test_Hcompta =
                                                                 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
                                                         , Calc.Balance.balance_by_unit =
                                                                Data.Map.fromList $
-                                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                                [ Calc.Balance.Unit_Sum
-                                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                         ["A":|[]]
                                                                 }
@@ -470,9 +507,9 @@ test_Hcompta =
                                                         [ ("A":|[], Amount.from_List [ Amount.usd $ 2 ]) ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 2
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -486,9 +523,9 @@ test_Hcompta =
                                                                 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
                                                         , Calc.Balance.balance_by_unit =
                                                                Data.Map.fromList $
-                                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                                [ Calc.Balance.Unit_Sum
-                                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                         ["A":|[]]
                                                                 }
@@ -500,9 +537,9 @@ test_Hcompta =
                                                                 [ ("B":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
                                                         , Calc.Balance.balance_by_unit =
                                                                Data.Map.fromList $
-                                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                                [ Calc.Balance.Unit_Sum
-                                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                         ["B":|[]]
                                                                 }
@@ -516,9 +553,9 @@ test_Hcompta =
                                                         , ("B":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 2
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
@@ -532,9 +569,9 @@ test_Hcompta =
                                                                 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
                                                         , Calc.Balance.balance_by_unit =
                                                                Data.Map.fromList $
-                                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                                [ Calc.Balance.Unit_Sum
-                                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                         ["A":|[]]
                                                                 }
@@ -546,9 +583,9 @@ test_Hcompta =
                                                                 [ ("B":|[], Amount.from_List [ Amount.eur $ 1 ]) ]
                                                         , Calc.Balance.balance_by_unit =
                                                                Data.Map.fromList $
-                                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                                [ Calc.Balance.Unit_Sum
-                                                                { Calc.Balance.unit_sum_amount = Amount.eur $ 1
+                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
                                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                         ["B":|[]]
                                                                 }
@@ -562,14 +599,14 @@ test_Hcompta =
                                                         , ("B":|[], Amount.from_List [ Amount.eur $ 1 ]) ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["B":|[]]
                                                         }
@@ -581,7 +618,7 @@ test_Hcompta =
                                         Calc.Balance.expanded
                                                 Lib.TreeMap.empty
                                         ~?=
-                                        (Lib.TreeMap.empty::Calc.Balance.Expanded Int String)
+                                        (Lib.TreeMap.empty::Calc.Balance.Expanded Amount String)
                                 , "A+$1 = A+$1" ~:
                                         Calc.Balance.expanded
                                                (Lib.TreeMap.from_List const
@@ -589,7 +626,7 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -600,11 +637,11 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List []
                                                         })
                                                 , ("A":|["A"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -615,11 +652,11 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List []
                                                         })
                                                 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -630,15 +667,15 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List []
                                                         })
                                                 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List []
                                                         })
                                                 , ("A":|["B", "C"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -651,11 +688,11 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 2 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 2 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -669,15 +706,15 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 3 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 3 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 2 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 2 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["B", "C"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -692,19 +729,19 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 4 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 4 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 3 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 3 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["B", "C"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 2 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 2 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["B", "C", "D"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -719,23 +756,23 @@ test_Hcompta =
                                         ~?=
                                         (Lib.TreeMap.from_List const
                                                 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 3 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 3 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("A":|["BB"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 , ("AA":|[], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List []
                                                         })
                                                 , ("AA":|["B"], Calc.Balance.Account_Sum_Expanded
-                                                        { Calc.Balance.inclusive = Amount.from_List [ Amount.usd $ 1 ]
+                                                        { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
                                                         , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
                                                         })
                                                 ])
@@ -751,9 +788,9 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -762,9 +799,9 @@ test_Hcompta =
                                         ~?=
                                         (Calc.Balance.Deviation $
                                                Data.Map.fromList $
-                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                [ Calc.Balance.Unit_Sum
-                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                         ["B":|[]]
                                                 }
@@ -779,9 +816,9 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 2
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 [ "A":|[]
                                                                 , "B":|[]
@@ -792,9 +829,9 @@ test_Hcompta =
                                         ~?=
                                         (Calc.Balance.Deviation $
                                                Data.Map.fromList $
-                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                [ Calc.Balance.Unit_Sum
-                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 2
+                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                         [
                                                         ]
@@ -818,9 +855,9 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -837,9 +874,9 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -856,14 +893,14 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
@@ -881,9 +918,9 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
@@ -901,9 +938,9 @@ test_Hcompta =
                                                                 ]
                                                         , Calc.Balance.balance_by_unit =
                                                                Data.Map.fromList $
-                                                               Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                                [ Calc.Balance.Unit_Sum
-                                                                { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                                 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                         ["A":|[]]
                                                                 }
@@ -921,14 +958,14 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["B":|[]]
                                                         }
@@ -946,14 +983,14 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ 1
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["B":|[]]
                                                         }
@@ -971,19 +1008,19 @@ test_Hcompta =
                                                         ]
                                                 , Calc.Balance.balance_by_unit =
                                                        Data.Map.fromList $
-                                                       Data.List.map (\s -> (Amount.unit $ Calc.Balance.unit_sum_amount s, s))
+                                                       Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
                                                        [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.eur $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
                                                        , Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.gbp $ 0
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.gbp $ 0
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
                                                                 ["A":|[], "B":|[]]
                                                         }
@@ -1019,13 +1056,9 @@ test_Hcompta =
                                         (Right $
                                                Format.Ledger.posting_by_Account
                                                 [ (Format.Ledger.posting ("A":|[]))
-                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.eur $ 1 ] }
-                                                , (Format.Ledger.posting ("A":|[]))
-                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1] }
-                                                , (Format.Ledger.posting ("B":|[]))
-                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1 ] }
+                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1, Amount.eur $ 1] }
                                                 , (Format.Ledger.posting ("B":|[]))
-                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.eur $ -1 ] }
+                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.eur $ -1, Amount.usd $ -1 ] }
                                                 ])
                                 , "{A+$1 B+$1}" ~:
                                         (snd $ Calc.Balance.infer_equilibrium $
@@ -1038,9 +1071,25 @@ test_Hcompta =
                                         ~?=
                                         (Left
                                                 [ Calc.Balance.Unit_Sum
-                                                        { Calc.Balance.unit_sum_amount = Amount.usd $ 2
+                                                        { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
                                                         , Calc.Balance.unit_sum_accounts = Data.Map.fromList []}
                                                 ])
+                                , "{A+$1 B-$1 B-1€}" ~:
+                                        (snd $ Calc.Balance.infer_equilibrium $
+                                               Format.Ledger.posting_by_Account
+                                                [ (Format.Ledger.posting ("A":|[]))
+                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ] }
+                                                , (Format.Ledger.posting ("B":|[]))
+                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1, Amount.eur $ -1 ] }
+                                                ])
+                                        ~?=
+                                        (Right $
+                                               Format.Ledger.posting_by_Account
+                                                [ (Format.Ledger.posting ("A":|[]))
+                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1, Amount.eur $ 1 ] }
+                                                , (Format.Ledger.posting ("B":|[]))
+                                                        { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1, Amount.eur $ -1 ] }
+                                                ])
                                 ]
                         ]
                 ]
@@ -2631,9 +2680,42 @@ test_Hcompta =
                                                                         , Format.Ledger.posting_sourcepos = P.newPos "" 2 1
                                                                         }
                                                                 , (Format.Ledger.posting ("a":|["b", "c"]))
-                                                                        { Format.Ledger.posting_sourcepos = P.newPos "" 3 1
+                                                                        { Format.Ledger.posting_amounts = Data.Map.fromList
+                                                                                [ ("$", Amount.nil
+                                                                                        { Amount.quantity = -1
+                                                                                        , Amount.style = Amount.Style.nil
+                                                                                                { Amount.Style.unit_side = Just Amount.Style.Side_Left
+                                                                                                , Amount.Style.unit_spaced = Just False
+                                                                                                }
+                                                                                        , Amount.unit = "$"
+                                                                                        })
+                                                                                ]
+                                                                        , Format.Ledger.posting_sourcepos = P.newPos "" 3 1
                                                                         }
                                                                 ]
+                                                        , Format.Ledger.transaction_postings_balance =
+                                                                Calc.Balance.Balance
+                                                                        { Calc.Balance.balance_by_account =
+                                                                               Lib.TreeMap.from_List const
+                                                                                [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
+                                                                                , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
+                                                                                ]
+                                                                        , Calc.Balance.balance_by_unit =
+                                                                               Data.Map.fromList $
+                                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
+                                                                               [ Calc.Balance.Unit_Sum
+                                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                                        { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                                        , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                                        , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                                        }
+                                                                                , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
+                                                                                        [ "A":|["B", "C"]
+                                                                                        , "a":|["b", "c"]
+                                                                                        ]
+                                                                                }
+                                                                               ]
+                                                                        }
                                                         , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
                                                         }
                                                 ]
@@ -2667,9 +2749,42 @@ test_Hcompta =
                                                                         , Format.Ledger.posting_sourcepos = P.newPos "" 2 1
                                                                         }
                                                                 , (Format.Ledger.posting ("a":|["b", "c"]))
-                                                                        { Format.Ledger.posting_sourcepos = P.newPos "" 3 1
+                                                                        { Format.Ledger.posting_amounts = Data.Map.fromList
+                                                                                [ ("$", Amount.nil
+                                                                                        { Amount.quantity = -1
+                                                                                        , Amount.style = Amount.Style.nil
+                                                                                                { Amount.Style.unit_side = Just Amount.Style.Side_Left
+                                                                                                , Amount.Style.unit_spaced = Just False
+                                                                                                }
+                                                                                        , Amount.unit = "$"
+                                                                                        })
+                                                                                ]
+                                                                        , Format.Ledger.posting_sourcepos = P.newPos "" 3 1
                                                                         }
                                                                 ]
+                                                        , Format.Ledger.transaction_postings_balance =
+                                                                Calc.Balance.Balance
+                                                                        { Calc.Balance.balance_by_account =
+                                                                               Lib.TreeMap.from_List const
+                                                                                [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
+                                                                                , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
+                                                                                ]
+                                                                        , Calc.Balance.balance_by_unit =
+                                                                               Data.Map.fromList $
+                                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
+                                                                               [ Calc.Balance.Unit_Sum
+                                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                                        { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                                        , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                                        , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                                        }
+                                                                                , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
+                                                                                        [ "A":|["B", "C"]
+                                                                                        , "a":|["b", "c"]
+                                                                                        ]
+                                                                                }
+                                                                               ]
+                                                                        }
                                                         , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
                                                         }
                                                 ]
@@ -2709,14 +2824,46 @@ test_Hcompta =
                                                                         , Format.Ledger.posting_sourcepos = P.newPos "" 5 1
                                                                         }
                                                                 , (Format.Ledger.posting ("a":|["b", "c"]))
-                                                                        { Format.Ledger.posting_sourcepos = P.newPos "" 6 1
-                                                                        , Format.Ledger.posting_tags = Data.Map.fromList []
+                                                                        { Format.Ledger.posting_amounts = Data.Map.fromList
+                                                                                [ ("$", Amount.nil
+                                                                                        { Amount.quantity = -1
+                                                                                        , Amount.style = Amount.Style.nil
+                                                                                                { Amount.Style.unit_side = Just Amount.Style.Side_Left
+                                                                                                , Amount.Style.unit_spaced = Just False
+                                                                                                }
+                                                                                        , Amount.unit = "$"
+                                                                                        })
+                                                                                ]
+                                                                        , Format.Ledger.posting_sourcepos = P.newPos "" 6 1
                                                                         }
                                                                 ]
-                                                        , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
                                                         , Format.Ledger.transaction_tags = Data.Map.fromList
                                                                 [ ("Tag", [""])
                                                                 ]
+                                                        , Format.Ledger.transaction_postings_balance =
+                                                                Calc.Balance.Balance
+                                                                        { Calc.Balance.balance_by_account =
+                                                                               Lib.TreeMap.from_List const
+                                                                                [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
+                                                                                , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
+                                                                                ]
+                                                                        , Calc.Balance.balance_by_unit =
+                                                                               Data.Map.fromList $
+                                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
+                                                                               [ Calc.Balance.Unit_Sum
+                                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                                        { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                                        , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                                        , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                                        }
+                                                                                , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
+                                                                                        [ "A":|["B", "C"]
+                                                                                        , "a":|["b", "c"]
+                                                                                        ]
+                                                                                }
+                                                                               ]
+                                                                        }
+                                                        , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
                                                         }
                                                 ]
                                         ]
@@ -2732,7 +2879,8 @@ test_Hcompta =
                                                        Data.Either.rights [jnl])
                                                 @?=
                                                 [ Format.Ledger.journal
-                                                        { Format.Ledger.journal_transactions = Format.Ledger.transaction_by_Date
+                                                        { Format.Ledger.journal_transactions =
+                                                               Format.Ledger.transaction_by_Date
                                                                 [ Format.Ledger.transaction
                                                                         { Format.Ledger.transaction_dates=
                                                                                 ( Time.ZonedTime
@@ -2757,9 +2905,42 @@ test_Hcompta =
                                                                                         , Format.Ledger.posting_sourcepos = P.newPos "" 2 1
                                                                                         }
                                                                                 , (Format.Ledger.posting ("a":|["b", "c"]))
-                                                                                        { Format.Ledger.posting_sourcepos = P.newPos "" 3 1
+                                                                                        { Format.Ledger.posting_amounts = Data.Map.fromList
+                                                                                                [ ("$", Amount.nil
+                                                                                                        { Amount.quantity = -1
+                                                                                                        , Amount.style = Amount.Style.nil
+                                                                                                                { Amount.Style.unit_side = Just Amount.Style.Side_Left
+                                                                                                                , Amount.Style.unit_spaced = Just False
+                                                                                                                }
+                                                                                                        , Amount.unit = "$"
+                                                                                                        })
+                                                                                                ]
+                                                                                        , Format.Ledger.posting_sourcepos = P.newPos "" 3 1
                                                                                         }
                                                                                 ]
+                                                                        , Format.Ledger.transaction_postings_balance =
+                                                                                Calc.Balance.Balance
+                                                                                        { Calc.Balance.balance_by_account =
+                                                                                               Lib.TreeMap.from_List const
+                                                                                                [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
+                                                                                                , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
+                                                                                                ]
+                                                                                        , Calc.Balance.balance_by_unit =
+                                                                                               Data.Map.fromList $
+                                                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
+                                                                                               [ Calc.Balance.Unit_Sum
+                                                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                                                        { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                                                        , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                                                        , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                                                        }
+                                                                                                , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
+                                                                                                        [ "A":|["B", "C"]
+                                                                                                        , "a":|["b", "c"]
+                                                                                                        ]
+                                                                                                }
+                                                                                               ]
+                                                                                        }
                                                                         , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
                                                                         }
                                                                 , Format.Ledger.transaction
@@ -2786,9 +2967,42 @@ test_Hcompta =
                                                                                         , Format.Ledger.posting_sourcepos = P.newPos "" 5 1
                                                                                         }
                                                                                 , (Format.Ledger.posting ("x":|["y", "z"]))
-                                                                                        { Format.Ledger.posting_sourcepos = P.newPos "" 6 1
+                                                                                        { Format.Ledger.posting_amounts = Data.Map.fromList
+                                                                                                [ ("$", Amount.nil
+                                                                                                        { Amount.quantity = -1
+                                                                                                        , Amount.style = Amount.Style.nil
+                                                                                                                { Amount.Style.unit_side = Just Amount.Style.Side_Left
+                                                                                                                , Amount.Style.unit_spaced = Just False
+                                                                                                                }
+                                                                                                        , Amount.unit = "$"
+                                                                                                        })
+                                                                                                ]
+                                                                                        , Format.Ledger.posting_sourcepos = P.newPos "" 6 1
                                                                                         }
                                                                                 ]
+                                                                        , Format.Ledger.transaction_postings_balance =
+                                                                                Calc.Balance.Balance
+                                                                                        { Calc.Balance.balance_by_account =
+                                                                                               Lib.TreeMap.from_List const
+                                                                                                [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
+                                                                                                , ("x":|["y", "z"], Amount.from_List [ Amount.usd $ -1 ])
+                                                                                                ]
+                                                                                        , Calc.Balance.balance_by_unit =
+                                                                                               Data.Map.fromList $
+                                                                                               Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
+                                                                                               [ Calc.Balance.Unit_Sum
+                                                                                                { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
+                                                                                                        { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
+                                                                                                        , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
+                                                                                                        , Calc.Balance.amount_sum_balance  = Data.Map.singleton () $ Amount.usd $ 0
+                                                                                                        }
+                                                                                                , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
+                                                                                                        [ "A":|["B", "C"]
+                                                                                                        , "x":|["y", "z"]
+                                                                                                        ]
+                                                                                                }
+                                                                                               ]
+                                                                                        }
                                                                         , Format.Ledger.transaction_sourcepos = P.newPos "" 4 1
                                                                         }
                                                                 ]
@@ -2799,25 +3013,41 @@ test_Hcompta =
                         , "Write" ~: TestList
                                 [ "account" ~: TestList
                                         [ "A" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.account Format.Ledger.Posting_Type_Regular $
                                                "A":|[])
                                                ~?=
                                                "A")
                                         , "A:B:C" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.account Format.Ledger.Posting_Type_Regular $
                                                "A":|["B", "C"])
                                                ~?=
                                                "A:B:C")
                                         , "(A:B:C)" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.account Format.Ledger.Posting_Type_Virtual $
                                                "A":|["B", "C"])
                                                ~?=
                                                "(A:B:C)")
                                         , "[A:B:C]" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.account Format.Ledger.Posting_Type_Virtual_Balanced $
                                                "A":|["B", "C"])
                                                ~?=
@@ -2825,13 +3055,21 @@ test_Hcompta =
                                         ]
                                 , "amount" ~: TestList
                                         [ "nil" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil)
                                                ~?=
                                                "0")
                                         , "nil @ prec=2" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.style = Amount.Style.nil
@@ -2840,7 +3078,11 @@ test_Hcompta =
                                                ~?=
                                                "0.00")
                                         , "123" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 0 123
@@ -2848,7 +3090,11 @@ test_Hcompta =
                                                ~?=
                                                "123")
                                         , "-123" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 0 (- 123)
@@ -2856,7 +3102,11 @@ test_Hcompta =
                                                ~?=
                                                "-123")
                                         , "12.3 @ prec=0" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 1 123
@@ -2867,7 +3117,11 @@ test_Hcompta =
                                                ~?=
                                                "12")
                                         , "12.5 @ prec=0" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 1 125
@@ -2878,7 +3132,11 @@ test_Hcompta =
                                                ~?=
                                                "13")
                                         , "12.3 @ prec=1" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 1 123
@@ -2890,7 +3148,11 @@ test_Hcompta =
                                                ~?=
                                                "12.3")
                                         , "1,234.56 @ prec=2" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 2 123456
@@ -2903,7 +3165,11 @@ test_Hcompta =
                                                ~?=
                                                "1,234.56")
                                         , "123,456,789,01,2.3456789 @ prec=7" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 7 1234567890123456789
@@ -2916,7 +3182,11 @@ test_Hcompta =
                                                ~?=
                                                "123,456,789,01,2.3456789")
                                         , "1234567.8,90,123,456,789 @ prec=12" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 12 1234567890123456789
@@ -2929,7 +3199,11 @@ test_Hcompta =
                                                ~?=
                                                "1234567.8,90,123,456,789")
                                         , "1,2,3,4,5,6,7,89,012.3456789 @ prec=7" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 7 1234567890123456789
@@ -2942,7 +3216,11 @@ test_Hcompta =
                                                ~?=
                                                "1,2,3,4,5,6,7,89,012.3456789")
                                         , "1234567.890,12,3,4,5,6,7,8,9 @ prec=12" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.amount
                                                Amount.nil
                                                 { Amount.quantity = Decimal 12 1234567890123456789
@@ -3077,13 +3355,21 @@ test_Hcompta =
                                         ]
                                 , "date" ~: TestList
                                         [ "nil" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date
                                                Date.nil)
                                                ~?=
                                                "1970/01/01")
                                         , "2000/01/01 12:34:51 CET" ~:
-                                               (Format.Ledger.Write.show False $
+                                               (Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date $
                                                Time.ZonedTime
                                                 (Time.LocalTime
@@ -3093,7 +3379,11 @@ test_Hcompta =
                                                ~?=
                                                "2000/01/01 12:34:51 CET"
                                         , "2000/01/01 12:34:51 +0100" ~:
-                                               (Format.Ledger.Write.show False $
+                                               (Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date $
                                                Time.ZonedTime
                                                 (Time.LocalTime
@@ -3103,7 +3393,11 @@ test_Hcompta =
                                                ~?=
                                                "2000/01/01 12:34:51 +0100"
                                         , "2000/01/01 01:02:03" ~:
-                                               (Format.Ledger.Write.show False $
+                                               (Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date $
                                                Time.ZonedTime
                                                 (Time.LocalTime
@@ -3113,7 +3407,11 @@ test_Hcompta =
                                                ~?=
                                                "2000/01/01 01:02:03"
                                         , "01/01 01:02" ~:
-                                               (Format.Ledger.Write.show False $
+                                               (Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date $
                                                Time.ZonedTime
                                                 (Time.LocalTime
@@ -3123,7 +3421,11 @@ test_Hcompta =
                                                ~?=
                                                "01/01 01:02"
                                         , "01/01 01:00" ~:
-                                               (Format.Ledger.Write.show False $
+                                               (Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date $
                                                Time.ZonedTime
                                                 (Time.LocalTime
@@ -3133,7 +3435,11 @@ test_Hcompta =
                                                ~?=
                                                "01/01 01:00"
                                         , "01/01 00:01" ~:
-                                               (Format.Ledger.Write.show False $
+                                               (Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date $
                                                Time.ZonedTime
                                                 (Time.LocalTime
@@ -3143,7 +3449,11 @@ test_Hcompta =
                                                ~?=
                                                "01/01 00:01"
                                         , "01/01" ~:
-                                               (Format.Ledger.Write.show False $
+                                               (Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.date $
                                                Time.ZonedTime
                                                 (Time.LocalTime
@@ -3155,13 +3465,21 @@ test_Hcompta =
                                         ]
                                 , "transaction" ~: TestList
                                         [ "nil" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.transaction
                                                Format.Ledger.transaction)
                                                ~?=
                                                "1970/01/01\n")
-                                        , "2000/01/01 some description\\n\\ta:b:c\\n\\t\\t; first comment\\n\\t\\t; second comment\\n\\t\\t; third comment\\n\\tA:B:C  $1" ~:
-                                               ((Format.Ledger.Write.show False $
+                                        , "2000/01/01 some description\\n\\ta:b:c\\n\\t ; first comment\\n\\t ; second comment\\n\\t ; third comment\\n\\tA:B:C  $1" ~:
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.transaction $
                                                Format.Ledger.transaction
                                                 { Format.Ledger.transaction_dates=
@@ -3191,9 +3509,13 @@ test_Hcompta =
                                                         ]
                                                 })
                                                ~?=
-                                               "2000/01/01 some description\n\ta:b:c\n\t\t; first comment\n\t\t; second comment\n\t\t; third comment\n\tA:B:C  $1")
+                                               "2000/01/01 some description\n\ta:b:c\n\t ; first comment\n\t ; second comment\n\t ; third comment\n\tA:B:C  $1")
                                         , "2000/01/01 some description\\n\\tA:B:C       $1\\n\\tAA:BB:CC  $123" ~:
-                                               ((Format.Ledger.Write.show False $
+                                               ((Format.Ledger.Write.show
+                                               Format.Ledger.Write.Style
+                                                { Format.Ledger.Write.style_color=False
+                                                , Format.Ledger.Write.style_align=True
+                                                } $
                                                Format.Ledger.Write.transaction $
                                                Format.Ledger.transaction
                                                 { Format.Ledger.transaction_dates=
index c26f66c71f2b0ff05ad2fd4584b497e6688fe68e..b1967a740fcc07e73ca76ac9f52bd8a904820fa7 100644 (file)
@@ -83,8 +83,8 @@ Library
     , array
     , containers >= 0.5 && < 0.6
                  -- NOTE: needed for Data.Map.Strict
-    , collections-api
-    , collections-base-instances
+    -- , collections-api
+    -- , collections-base-instances
     , Decimal
     , directory
     , filepath