lib: fix combineJournalUpdates folding order
NOTE: this is important to correctly build JournalContext
NOTE: currently a list reverse must done at the end,
maybe using a Data.Queue would be more efficient.
This commit is contained in:
parent
3050152cb3
commit
c65fea2b4b
@ -146,19 +146,19 @@ mainfile :: Journal -> (FilePath, String)
|
|||||||
mainfile = headDef ("", "") . files
|
mainfile = headDef ("", "") . files
|
||||||
|
|
||||||
addTransaction :: Transaction -> Journal -> Journal
|
addTransaction :: Transaction -> Journal -> Journal
|
||||||
addTransaction t l0 = l0 { jtxns = t : jtxns l0 }
|
addTransaction t j = j { jtxns = t : jtxns j }
|
||||||
|
|
||||||
addModifierTransaction :: ModifierTransaction -> Journal -> Journal
|
addModifierTransaction :: ModifierTransaction -> Journal -> Journal
|
||||||
addModifierTransaction mt l0 = l0 { jmodifiertxns = mt : jmodifiertxns l0 }
|
addModifierTransaction mt j = j { jmodifiertxns = mt : jmodifiertxns j }
|
||||||
|
|
||||||
addPeriodicTransaction :: PeriodicTransaction -> Journal -> Journal
|
addPeriodicTransaction :: PeriodicTransaction -> Journal -> Journal
|
||||||
addPeriodicTransaction pt l0 = l0 { jperiodictxns = pt : jperiodictxns l0 }
|
addPeriodicTransaction pt j = j { jperiodictxns = pt : jperiodictxns j }
|
||||||
|
|
||||||
addHistoricalPrice :: HistoricalPrice -> Journal -> Journal
|
addHistoricalPrice :: HistoricalPrice -> Journal -> Journal
|
||||||
addHistoricalPrice h l0 = l0 { historical_prices = h : historical_prices l0 }
|
addHistoricalPrice h j = j { historical_prices = h : historical_prices j }
|
||||||
|
|
||||||
addTimeLogEntry :: TimeLogEntry -> Journal -> Journal
|
addTimeLogEntry :: TimeLogEntry -> Journal -> Journal
|
||||||
addTimeLogEntry tle l0 = l0 { open_timelog_entries = tle : open_timelog_entries l0 }
|
addTimeLogEntry tle j = j { open_timelog_entries = tle : open_timelog_entries j }
|
||||||
|
|
||||||
-- | Unique transaction descriptions used in this journal.
|
-- | Unique transaction descriptions used in this journal.
|
||||||
journalDescriptions :: Journal -> [String]
|
journalDescriptions :: Journal -> [String]
|
||||||
@ -404,8 +404,16 @@ journalFinalise :: ClockTime -> LocalTime -> FilePath -> String -> JournalContex
|
|||||||
journalFinalise tclock tlocal path txt ctx assrt j@Journal{files=fs} = do
|
journalFinalise tclock tlocal path txt ctx assrt j@Journal{files=fs} = do
|
||||||
(journalBalanceTransactions $
|
(journalBalanceTransactions $
|
||||||
journalCanonicaliseAmounts $
|
journalCanonicaliseAmounts $
|
||||||
journalCloseTimeLogEntries tlocal
|
journalCloseTimeLogEntries tlocal $
|
||||||
j{files=(path,txt):fs, filereadtime=tclock, jContext=ctx})
|
j{ files=(path,txt):fs
|
||||||
|
, filereadtime=tclock
|
||||||
|
, jContext=ctx
|
||||||
|
, jtxns=reverse $ jtxns j -- NOTE: see addTransaction
|
||||||
|
, jmodifiertxns=reverse $ jmodifiertxns j -- NOTE: see addModifierTransaction
|
||||||
|
, jperiodictxns=reverse $ jperiodictxns j -- NOTE: see addPeriodicTransaction
|
||||||
|
, historical_prices=reverse $ historical_prices j -- NOTE: see addHistoricalPrice
|
||||||
|
, open_timelog_entries=reverse $ open_timelog_entries j -- NOTE: see addTimeLogEntry
|
||||||
|
})
|
||||||
>>= if assrt then journalCheckBalanceAssertions else return
|
>>= if assrt then journalCheckBalanceAssertions else return
|
||||||
|
|
||||||
-- | Check any balance assertions in the journal and return an error
|
-- | Check any balance assertions in the journal and return an error
|
||||||
|
|||||||
@ -193,7 +193,7 @@ data Journal = Journal {
|
|||||||
files :: [(FilePath, String)], -- ^ the file path and raw text of the main and
|
files :: [(FilePath, String)], -- ^ the file path and raw text of the main and
|
||||||
-- any included journal files. The main file is
|
-- any included journal files. The main file is
|
||||||
-- first followed by any included files in the
|
-- first followed by any included files in the
|
||||||
-- order encountered (XXX reversed, cf journalAddFile).
|
-- order encountered.
|
||||||
filereadtime :: ClockTime, -- ^ when this journal was last read from its file(s)
|
filereadtime :: ClockTime, -- ^ when this journal was last read from its file(s)
|
||||||
jcommoditystyles :: M.Map Commodity AmountStyle -- ^ how to display amounts in each commodity
|
jcommoditystyles :: M.Map Commodity AmountStyle -- ^ how to display amounts in each commodity
|
||||||
} deriving (Eq, Typeable, Data)
|
} deriving (Eq, Typeable, Data)
|
||||||
|
|||||||
@ -93,7 +93,7 @@ parse _ = parseJournalWith journal
|
|||||||
|
|
||||||
-- | Flatten a list of JournalUpdate's into a single equivalent one.
|
-- | Flatten a list of JournalUpdate's into a single equivalent one.
|
||||||
combineJournalUpdates :: [JournalUpdate] -> JournalUpdate
|
combineJournalUpdates :: [JournalUpdate] -> JournalUpdate
|
||||||
combineJournalUpdates us = liftM (foldl' (.) id) $ sequence us
|
combineJournalUpdates us = liftM (foldl' (\acc new x -> new (acc x)) id) $ sequence us
|
||||||
|
|
||||||
-- | Given a JournalUpdate-generating parsec parser, file path and data string,
|
-- | Given a JournalUpdate-generating parsec parser, file path and data string,
|
||||||
-- parse and post-process a Journal so that it's ready to use, or give an error.
|
-- parse and post-process a Journal so that it's ready to use, or give an error.
|
||||||
@ -218,7 +218,7 @@ includedirective = do
|
|||||||
|
|
||||||
journalAddFile :: (FilePath,String) -> Journal -> Journal
|
journalAddFile :: (FilePath,String) -> Journal -> Journal
|
||||||
journalAddFile f j@Journal{files=fs} = j{files=fs++[f]}
|
journalAddFile f j@Journal{files=fs} = j{files=fs++[f]}
|
||||||
-- XXX currently called in reverse order of includes, I can't see why
|
-- NOTE: first encountered file to left, to avoid a reverse
|
||||||
|
|
||||||
accountdirective :: ParsecT [Char] JournalContext (ErrorT String IO) JournalUpdate
|
accountdirective :: ParsecT [Char] JournalContext (ErrorT String IO) JournalUpdate
|
||||||
accountdirective = do
|
accountdirective = do
|
||||||
|
|||||||
@ -49,7 +49,7 @@ module Hledger.Read.TimelogReader (
|
|||||||
where
|
where
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Control.Monad.Error
|
import Control.Monad.Error
|
||||||
import Data.List (isPrefixOf)
|
import Data.List (isPrefixOf, foldl')
|
||||||
import Test.HUnit
|
import Test.HUnit
|
||||||
import Text.Parsec hiding (parse)
|
import Text.Parsec hiding (parse)
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
@ -85,7 +85,7 @@ timelogFile :: ParsecT [Char] JournalContext (ErrorT String IO) (JournalUpdate,
|
|||||||
timelogFile = do items <- many timelogItem
|
timelogFile = do items <- many timelogItem
|
||||||
eof
|
eof
|
||||||
ctx <- getState
|
ctx <- getState
|
||||||
return (liftM (foldr (.) id) $ sequence items, ctx)
|
return (liftM (foldl' (\acc new x -> new (acc x)) id) $ sequence items, ctx)
|
||||||
where
|
where
|
||||||
-- As all ledger line types can be distinguished by the first
|
-- As all ledger line types can be distinguished by the first
|
||||||
-- character, excepting transactions versus empty (blank or
|
-- character, excepting transactions versus empty (blank or
|
||||||
|
|||||||
@ -57,8 +57,7 @@ showLedgerStats l today span =
|
|||||||
-- w2 = maximum $ map (length . show . snd) stats
|
-- w2 = maximum $ map (length . show . snd) stats
|
||||||
stats = [
|
stats = [
|
||||||
("Main journal file" :: String, path) -- ++ " (from " ++ source ++ ")")
|
("Main journal file" :: String, path) -- ++ " (from " ++ source ++ ")")
|
||||||
,("Included journal files", unlines $ reverse $ -- cf journalAddFile
|
,("Included journal files", unlines $ drop 1 $ journalFilePaths j)
|
||||||
drop 1 $ journalFilePaths j)
|
|
||||||
,("Transactions span", printf "%s to %s (%d days)" (start span) (end span) days)
|
,("Transactions span", printf "%s to %s (%d days)" (start span) (end span) days)
|
||||||
,("Last transaction", maybe "none" show lastdate ++ showelapsed lastelapsed)
|
,("Last transaction", maybe "none" show lastdate ++ showelapsed lastelapsed)
|
||||||
,("Transactions", printf "%d (%0.1f per day)" tnum txnrate)
|
,("Transactions", printf "%d (%0.1f per day)" tnum txnrate)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user