lib: Make queryDepth return Maybe Int.
This commit is contained in:
parent
dc076b0d5b
commit
51ea6d9f25
@ -64,7 +64,7 @@ import Data.Monoid ((<>))
|
||||
#endif
|
||||
import qualified Data.Text as T
|
||||
import Data.Time.Calendar
|
||||
import Safe (readDef, maximumByDef, maximumDef, minimumDef)
|
||||
import Safe (readDef, maximumByMay, maximumMay, minimumMay)
|
||||
import Text.Megaparsec
|
||||
import Text.Megaparsec.Char
|
||||
|
||||
@ -488,33 +488,33 @@ queryDateSpan' _ = nulldatespan
|
||||
|
||||
-- | What is the earliest of these dates, where Nothing is earliest ?
|
||||
earliestMaybeDate :: [Maybe Day] -> Maybe Day
|
||||
earliestMaybeDate = minimumDef Nothing
|
||||
earliestMaybeDate = fromMaybe Nothing . minimumMay
|
||||
|
||||
-- | What is the latest of these dates, where Nothing is earliest ?
|
||||
latestMaybeDate :: [Maybe Day] -> Maybe Day
|
||||
latestMaybeDate = maximumDef Nothing
|
||||
latestMaybeDate = fromMaybe Nothing . maximumMay
|
||||
|
||||
-- | What is the earliest of these dates, where Nothing is the latest ?
|
||||
earliestMaybeDate' :: [Maybe Day] -> Maybe Day
|
||||
earliestMaybeDate' = minimumDef Nothing . filter isJust
|
||||
earliestMaybeDate' = fromMaybe Nothing . minimumMay . filter isJust
|
||||
|
||||
-- | What is the latest of these dates, where Nothing is the latest ?
|
||||
latestMaybeDate' :: [Maybe Day] -> Maybe Day
|
||||
latestMaybeDate' = maximumByDef Nothing compareNothingMax
|
||||
latestMaybeDate' = fromMaybe Nothing . maximumByMay compareNothingMax
|
||||
where
|
||||
compareNothingMax Nothing Nothing = EQ
|
||||
compareNothingMax (Just _) Nothing = LT
|
||||
compareNothingMax Nothing (Just _) = GT
|
||||
compareNothingMax (Just a) (Just b) = compare a b
|
||||
|
||||
-- | The depth limit this query specifies, or a large number if none.
|
||||
queryDepth :: Query -> Int
|
||||
queryDepth = minimumDef maxBound . queryDepth'
|
||||
-- | The depth limit this query specifies, if it has one
|
||||
queryDepth :: Query -> Maybe Int
|
||||
queryDepth = minimumMay . queryDepth'
|
||||
where
|
||||
queryDepth' (Depth d) = [d]
|
||||
queryDepth' (Or qs) = concatMap queryDepth' qs
|
||||
queryDepth' (And qs) = concatMap queryDepth' qs
|
||||
queryDepth' _ = []
|
||||
queryDepth' (Or qs) = concatMap queryDepth' qs
|
||||
queryDepth' (And qs) = concatMap queryDepth' qs
|
||||
queryDepth' _ = []
|
||||
|
||||
-- | The account we are currently focussed on, if any, and whether subaccounts are included.
|
||||
-- Just looks at the first query option.
|
||||
|
||||
@ -289,7 +289,7 @@ acctChangesFromPostings ropts q ps = HM.fromList [(aname a, a) | a <- as]
|
||||
as = filterAccounts . drop 1 $ accountsFromPostings ps
|
||||
filterAccounts = case accountlistmode_ ropts of
|
||||
ALTree -> filter ((depthq `matchesAccount`) . aname) -- exclude deeper balances
|
||||
ALFlat -> clipAccountsAndAggregate (queryDepth depthq) . -- aggregate deeper balances at the depth limit.
|
||||
ALFlat -> maybe id clipAccountsAndAggregate (queryDepth depthq) . -- aggregate deeper balances at the depth limit.
|
||||
filter ((0<) . anumpostings)
|
||||
depthq = dbg "depthq" $ filterQuery queryIsDepth q
|
||||
|
||||
@ -299,8 +299,8 @@ calculateAccountChanges :: ReportOpts -> Query -> [DateSpan]
|
||||
-> Map DateSpan [Posting]
|
||||
-> HashMap ClippedAccountName (Map DateSpan Account)
|
||||
calculateAccountChanges ropts q colspans colps
|
||||
| queryDepth q == 0 = acctchanges <> elided
|
||||
| otherwise = acctchanges
|
||||
| queryDepth q == Just 0 = acctchanges <> elided
|
||||
| otherwise = acctchanges
|
||||
where
|
||||
-- Transpose to get each account's balance changes across all columns.
|
||||
acctchanges = transposeMap colacctchanges
|
||||
@ -461,7 +461,7 @@ displayedAccounts ropts q valuedaccts
|
||||
tallies = subaccountTallies . HM.keys $ HM.filterWithKey isInteresting valuedaccts
|
||||
|
||||
isZeroRow balance = all (mixedAmountLooksZero . balance)
|
||||
depth = queryDepth q
|
||||
depth = fromMaybe maxBound $ queryDepth q
|
||||
|
||||
-- | Sort the rows by amount or by account declaration order.
|
||||
sortRows :: ReportOpts -> Journal -> [MultiBalanceReportRow] -> [MultiBalanceReportRow]
|
||||
|
||||
@ -72,7 +72,7 @@ postingsReport ropts@ReportOpts{..} q j =
|
||||
where
|
||||
reportspan = adjustReportDates ropts q j
|
||||
whichdate = whichDateFromOpts ropts
|
||||
depth = queryDepth q
|
||||
depth = fromMaybe maxBound $ queryDepth q
|
||||
styles = journalCommodityStyles j
|
||||
priceoracle = journalPriceOracle infer_value_ j
|
||||
multiperiod = interval_ /= NoInterval
|
||||
|
||||
@ -92,7 +92,7 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=rop
|
||||
reportopts_= ropts{
|
||||
-- incorporate any depth: query args into depth_,
|
||||
-- any date: query args into period_
|
||||
depth_ =depthfromoptsandargs,
|
||||
depth_ =queryDepth q,
|
||||
period_=periodfromoptsandargs,
|
||||
query_ =unwords -- as in ReportOptions, with same limitations
|
||||
$ collectopts filteredQueryArg (rawopts_ copts),
|
||||
@ -107,8 +107,6 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=rop
|
||||
}
|
||||
where
|
||||
q = queryFromOpts d ropts
|
||||
depthfromoptsandargs = case queryDepth q of 99999 -> Nothing
|
||||
d -> Just d
|
||||
datespanfromargs = queryDateSpan (date2_ ropts) $ fst $ parseQuery d (T.pack $ query_ ropts)
|
||||
periodfromoptsandargs =
|
||||
dateSpanAsPeriod $ spansIntersect [periodAsDateSpan $ period_ ropts, datespanfromargs]
|
||||
|
||||
@ -74,10 +74,10 @@ accounts CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do
|
||||
-- 3. if there's a depth limit, depth-clip and remove any no longer useful items
|
||||
clippedaccts =
|
||||
dbg1 "clippedaccts" $
|
||||
filter (matchesAccount acctq) $ -- clipping can leave accounts that no longer match the query, remove such
|
||||
nub $ -- clipping can leave duplicates (adjacent, hopefully)
|
||||
filter (not . T.null) $ -- depth:0 can leave nulls
|
||||
map (clipAccountName depth) $ -- clip at depth if specified
|
||||
filter (matchesAccount acctq) $ -- clipping can leave accounts that no longer match the query, remove such
|
||||
nub $ -- clipping can leave duplicates (adjacent, hopefully)
|
||||
filter (not . T.null) $ -- depth:0 can leave nulls
|
||||
maybe id (map . clipAccountName) depth $ -- clip at depth if specified
|
||||
sortedaccts
|
||||
|
||||
-- 4. print what remains as a list or tree, maybe applying --drop in the former case
|
||||
|
||||
Loading…
Reference in New Issue
Block a user