From 6f92e70575a76771dc82662ce28ed0a91e6b84ae Mon Sep 17 00:00:00 2001 From: Dmitry Astapov Date: Tue, 28 Nov 2017 01:22:44 +0000 Subject: [PATCH] lib: remove needless numeric comparisons in bal/bs accountsFromPostings is currently doing excessive work when adding up postings in each account. It sorts (accountName, amount) tuples which cause amounts in them to be compared. There is no need to look at amount here at all since subsequent summing up and counting does not depend on order. It is enough to sort by accountname only. Went through similar pieces of code, made them all look uniform. --- hledger-lib/Hledger/Data/Account.hs | 10 +++++----- hledger-lib/Hledger/Data/Journal.hs | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hledger-lib/Hledger/Data/Account.hs b/hledger-lib/Hledger/Data/Account.hs index 64cfbaf0a..e1dc82415 100644 --- a/hledger-lib/Hledger/Data/Account.hs +++ b/hledger-lib/Hledger/Data/Account.hs @@ -10,6 +10,7 @@ account, and subaccounting-excluding and -including balances. module Hledger.Data.Account where import Data.List +import Data.List.Extra (groupSort, groupOn) import Data.Maybe import Data.Ord import qualified Data.Map as M @@ -63,10 +64,9 @@ nullacct = Account accountsFromPostings :: [Posting] -> [Account] accountsFromPostings ps = let - acctamts = [(paccount p,pamount p) | p <- ps] - grouped = groupBy (\a b -> fst a == fst b) $ sort $ acctamts - counted = [(a, length acctamts) | acctamts@((a,_):_) <- grouped] - summed = map (\as@((aname,_):_) -> (aname, sumStrict $ map snd as)) grouped -- always non-empty + grouped = groupSort [(paccount p,pamount p) | p <- ps] + counted = [(aname, length amts) | (aname, amts) <- grouped] + summed = [(aname, sumStrict amts) | (aname, amts) <- grouped] -- always non-empty nametree = treeFromPaths $ map (expandAccountName . fst) summed acctswithnames = nameTreeToAccount "root" nametree acctswithnumps = mapAccounts setnumps acctswithnames where setnumps a = a{anumpostings=fromMaybe 0 $ lookup (aname a) counted} @@ -132,7 +132,7 @@ clipAccountsAndAggregate d as = combined where clipped = [a{aname=clipOrEllipsifyAccountName d $ aname a} | a <- as] combined = [a{aebalance=sum (map aebalance same)} - | same@(a:_) <- groupBy (\a1 a2 -> aname a1 == aname a2) clipped] + | same@(a:_) <- groupOn aname clipped] {- test cases, assuming d=1: diff --git a/hledger-lib/Hledger/Data/Journal.hs b/hledger-lib/Hledger/Data/Journal.hs index 672b4e3c4..520ee942b 100644 --- a/hledger-lib/Hledger/Data/Journal.hs +++ b/hledger-lib/Hledger/Data/Journal.hs @@ -75,6 +75,7 @@ import Data.Array.ST import Data.Functor.Identity (Identity(..)) import qualified Data.HashTable.ST.Cuckoo as HT import Data.List +import Data.List.Extra (groupSort) -- import Data.Map (findWithDefault) import Data.Maybe import Data.Monoid @@ -752,8 +753,7 @@ journalInferCommodityStyles j = commodityStylesFromAmounts :: [Amount] -> M.Map CommoditySymbol AmountStyle commodityStylesFromAmounts amts = M.fromList commstyles where - samecomm = \a1 a2 -> acommodity a1 == acommodity a2 - commamts = [(acommodity $ head as, as) | as <- groupBy samecomm $ sortBy (comparing acommodity) amts] + commamts = groupSort [(acommodity as, as) | as <- amts] commstyles = [(c, canonicalStyleFrom $ map astyle as) | (c,as) <- commamts] -- | Given an ordered list of amount styles, choose a canonical style.