refactor
This commit is contained in:
		
							parent
							
								
									abcc831b5a
								
							
						
					
					
						commit
						306013e21e
					
				| @ -5,8 +5,11 @@ A ledger-compatible @register@ command. | |||||||
| 
 | 
 | ||||||
| -} | -} | ||||||
| 
 | 
 | ||||||
| module Commands.Register | module Commands.Register ( | ||||||
| where |   register | ||||||
|  |  ,showRegisterReport | ||||||
|  | ) where | ||||||
|  | 
 | ||||||
| import Safe (headMay, lastMay) | import Safe (headMay, lastMay) | ||||||
| import Ledger | import Ledger | ||||||
| import Options | import Options | ||||||
| @ -25,26 +28,40 @@ register opts args l = do | |||||||
| -- | Generate the register report, which is a list of postings with transaction | -- | Generate the register report, which is a list of postings with transaction | ||||||
| -- info and a running balance. | -- info and a running balance. | ||||||
| showRegisterReport :: [Opt] -> FilterSpec -> Ledger -> String | showRegisterReport :: [Opt] -> FilterSpec -> Ledger -> String | ||||||
| showRegisterReport opts filterspec l | showRegisterReport opts filterspec l = showpostings ps nullposting startbal | ||||||
|     | interval == NoInterval = showpostings displayedps nullposting startbal |  | ||||||
|     | otherwise = showpostings summaryps nullposting startbal |  | ||||||
|     where |     where | ||||||
|  |       ps | interval == NoInterval = displayableps | ||||||
|  |          | otherwise             = summarisePostings interval depth empty span displayableps | ||||||
|       startbal = sumPostings precedingps |       startbal = sumPostings precedingps | ||||||
|       (displayedps, _) = span displayExprMatches restofps |       (precedingps,displayableps,_) = | ||||||
|       (precedingps, restofps) = break displayExprMatches sortedps |           postingsMatchingDisplayExpr (displayExprFromOpts opts) $ journalPostings $ filterJournalPostings filterspec $ journal l | ||||||
|       sortedps = sortBy (comparing postingDate) ps |       (interval, depth, empty) = (intervalFromOpts opts, depthFromOpts opts, Empty `elem` opts) | ||||||
|       ps = journalPostings $ filterJournalPostings filterspec $ journal l |       span = datespan filterspec | ||||||
|       summaryps = concatMap summarisespan spans | 
 | ||||||
|  | -- | Convert a list of postings into summary postings, one per interval. | ||||||
|  | summarisePostings :: Interval -> Maybe Int -> Bool -> DateSpan -> [Posting] -> [Posting] | ||||||
|  | summarisePostings interval depth empty span ps = concatMap summarisespan spans | ||||||
|  |     where | ||||||
|       summarisespan s = summarisePostingsInDateSpan s depth empty (postingsinspan s) |       summarisespan s = summarisePostingsInDateSpan s depth empty (postingsinspan s) | ||||||
|       postingsinspan s = filter (isPostingInDateSpan s) displayedps |           where postingsinspan s = filter (isPostingInDateSpan s) ps | ||||||
|       spans = splitSpan interval (postingsDateSpan displayedps) |       spans = splitSpan interval spantoreport | ||||||
|       interval = intervalFromOpts opts |           where spantoreport | empty = span | ||||||
|       empty = Empty `elem` opts |                              | otherwise = postingsDateSpan ps | ||||||
|       depth = depthFromOpts opts | 
 | ||||||
|       dispexpr = displayExprFromOpts opts | -- | Date-sort and split a list of postings into three spans - postings matched | ||||||
|       displayExprMatches p = case dispexpr of | -- by the given display expression, and the preceding and following postings. | ||||||
|                                Nothing -> True | postingsMatchingDisplayExpr :: Maybe String -> [Posting] -> ([Posting],[Posting],[Posting]) | ||||||
|                                Just e  -> (fromparse $ parsewith datedisplayexpr e) p | postingsMatchingDisplayExpr d ps = (before, matched, after) | ||||||
|  |     where  | ||||||
|  |       sorted = sortBy (comparing postingDate) ps | ||||||
|  |       (before, rest) = break (displayExprMatches d) sorted | ||||||
|  |       (matched, after) = span (displayExprMatches d) rest | ||||||
|  | 
 | ||||||
|  | -- | Does this display expression allow this posting to be displayed ? | ||||||
|  | -- Raises an error if the display expression can't be parsed. | ||||||
|  | displayExprMatches :: Maybe String -> Posting -> Bool | ||||||
|  | displayExprMatches Nothing  _ = True | ||||||
|  | displayExprMatches (Just d) p = (fromparse $ parsewith datedisplayexpr d) p | ||||||
|                          |                          | ||||||
| -- XXX confusing, refactor | -- XXX confusing, refactor | ||||||
| -- | Given a date span (representing a reporting interval) and a list of | -- | Given a date span (representing a reporting interval) and a list of | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user