From fdd7feefdb51c53e584703963300a1afd7fccd65 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Wed, 18 May 2016 15:08:50 -0700 Subject: [PATCH] lib: make Journal a monoid --- hledger-lib/Hledger/Data/Journal.hs | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/hledger-lib/Hledger/Data/Journal.hs b/hledger-lib/Hledger/Data/Journal.hs index cb58a89a7..85f76c5e4 100644 --- a/hledger-lib/Hledger/Data/Journal.hs +++ b/hledger-lib/Hledger/Data/Journal.hs @@ -63,6 +63,7 @@ import Control.Monad import Data.List -- import Data.Map (findWithDefault) import Data.Maybe +import Data.Monoid import Data.Ord import Safe (headMay, headDef) import Data.Time.Calendar @@ -123,6 +124,26 @@ instance Show Journal where -- ,show $ map fst $ files j -- ] +-- The monoid instance for Journal concatenates the list fields, +-- combines the map fields, keeps the final comment lines of the +-- second journal, and keeps the latest of their last read times. +-- See JournalContext for how the final parse contexts are combined. +instance Monoid Journal where + mempty = nulljournal + mappend j1 j2 = + Journal{jmodifiertxns = jmodifiertxns j1 <> jmodifiertxns j2 -- [ModifierTransaction] + ,jperiodictxns = jperiodictxns j1 <> jperiodictxns j2 -- [PeriodicTransaction] + ,jtxns = jtxns j1 <> jtxns j2 -- [Transaction] + ,jcommoditystyles = jcommoditystyles j1 <> jcommoditystyles j2 -- M.Map CommoditySymbol AmountStyle + ,jcommodities = jcommodities j1 <> jcommodities j2 -- M.Map CommoditySymbol Commodity + ,open_timeclock_entries = open_timeclock_entries j1 <> open_timeclock_entries j2 -- [TimeclockEntry] + ,jmarketprices = jmarketprices j1 <> jmarketprices j2 -- [MarketPrice] + ,final_comment_lines = final_comment_lines j1 <> final_comment_lines j2 -- String + ,jContext = jContext j1 <> jContext j2 -- JournalContext + ,files = files j1 <> files j2 -- [(FilePath, String)] + ,filereadtime = max (filereadtime j1) (filereadtime j2) + } + nulljournal :: Journal nulljournal = Journal { jmodifiertxns = [] , jperiodictxns = [] @@ -137,6 +158,22 @@ nulljournal = Journal { jmodifiertxns = [] , jcommoditystyles = M.fromList [] } +-- The monoid instance for JournalContext assumes the second context +-- is that of an included journal, so it is mostly discarded except +-- the accounts defined by account directives are concatenated, and +-- the transaction indices (counts of transactions parsed, if any) are +-- added. +instance Monoid JournalContext where + mempty = nullctx + mappend c1 c2 = + Ctx { ctxYear = ctxYear c1 + , ctxDefaultCommodityAndStyle = ctxDefaultCommodityAndStyle c1 + , ctxAccounts = ctxAccounts c1 ++ ctxAccounts c2 + , ctxParentAccount = ctxParentAccount c1 + , ctxAliases = ctxAliases c1 + , ctxTransactionIndex = ctxTransactionIndex c1 + ctxTransactionIndex c2 + } + nullctx :: JournalContext nullctx = Ctx{ctxYear=Nothing, ctxDefaultCommodityAndStyle=Nothing, ctxAccounts=[], ctxParentAccount=[], ctxAliases=[], ctxTransactionIndex=0}