lib: make Journal a monoid
This commit is contained in:
parent
6ed0369cdc
commit
fdd7feefdb
@ -63,6 +63,7 @@ import Control.Monad
|
|||||||
import Data.List
|
import Data.List
|
||||||
-- import Data.Map (findWithDefault)
|
-- import Data.Map (findWithDefault)
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
|
import Data.Monoid
|
||||||
import Data.Ord
|
import Data.Ord
|
||||||
import Safe (headMay, headDef)
|
import Safe (headMay, headDef)
|
||||||
import Data.Time.Calendar
|
import Data.Time.Calendar
|
||||||
@ -123,6 +124,26 @@ instance Show Journal where
|
|||||||
-- ,show $ map fst $ files j
|
-- ,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
|
||||||
nulljournal = Journal { jmodifiertxns = []
|
nulljournal = Journal { jmodifiertxns = []
|
||||||
, jperiodictxns = []
|
, jperiodictxns = []
|
||||||
@ -137,6 +158,22 @@ nulljournal = Journal { jmodifiertxns = []
|
|||||||
, jcommoditystyles = M.fromList []
|
, 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 :: JournalContext
|
||||||
nullctx = Ctx{ctxYear=Nothing, ctxDefaultCommodityAndStyle=Nothing, ctxAccounts=[], ctxParentAccount=[], ctxAliases=[], ctxTransactionIndex=0}
|
nullctx = Ctx{ctxYear=Nothing, ctxDefaultCommodityAndStyle=Nothing, ctxAccounts=[], ctxParentAccount=[], ctxAliases=[], ctxTransactionIndex=0}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user