Fix a few spaceleaks (#413)
This commit is contained in:
		
							parent
							
								
									d92d777c97
								
							
						
					
					
						commit
						d236f7b237
					
				| @ -64,7 +64,7 @@ accountsFromPostings ps = | ||||
|     acctamts = [(paccount p,pamount p) | p <- ps] | ||||
|     grouped = groupBy (\a b -> fst a == fst b) $ sort $ acctamts | ||||
|     counted = [(a, length acctamts) | acctamts@((a,_):_) <- grouped] | ||||
|     summed = map (\as@((aname,_):_) -> (aname, sum $ map snd as)) grouped -- always non-empty | ||||
|     summed = map (\as@((aname,_):_) -> (aname, sumStrict $ map snd as)) grouped -- always non-empty | ||||
|     nametree = treeFromPaths $ map (expandAccountName . fst) summed | ||||
|     acctswithnames = nameTreeToAccount "root" nametree | ||||
|     acctswithnumps = mapAccounts setnumps    acctswithnames where setnumps    a = a{anumpostings=fromMaybe 0 $ lookup (aname a) counted} | ||||
|  | ||||
| @ -435,7 +435,7 @@ tests_normaliseMixedAmountSquashPricesForDisplay = [ | ||||
| -- rendering helper. | ||||
| sumSimilarAmountsUsingFirstPrice :: [Amount] -> Amount | ||||
| sumSimilarAmountsUsingFirstPrice [] = nullamt | ||||
| sumSimilarAmountsUsingFirstPrice as = (sum as){aprice=aprice $ head as} | ||||
| sumSimilarAmountsUsingFirstPrice as = (sumStrict as){aprice=aprice $ head as} | ||||
| 
 | ||||
| -- -- | Sum same-commodity amounts. If there were different prices, set | ||||
| -- -- the price to a special marker indicating "various". Only used as a | ||||
|  | ||||
| @ -584,8 +584,8 @@ journalBalanceTransactionsST assrt j createStore storeIn extract = | ||||
|     flip R.runReaderT (Env bals (storeIn txStore) assrt $ | ||||
|                        Just $ jinferredcommodities j) $ do | ||||
|       dated <- fmap snd . sortBy (comparing fst) . concat | ||||
|              <$> mapM discriminateByDate (jtxns j) | ||||
|       mapM checkInferAndRegisterAmounts dated | ||||
|              <$> mapM' discriminateByDate (jtxns j) | ||||
|       mapM' checkInferAndRegisterAmounts dated | ||||
|     lift $ extract txStore | ||||
|   where size = genericLength $ journalPostings j | ||||
| 
 | ||||
| @ -759,7 +759,7 @@ canonicalStyleFrom ss@(first:_) = | ||||
|   where | ||||
|     mgrps = maybe Nothing Just $ headMay $ catMaybes $ map asdigitgroups ss | ||||
|     -- precision is maximum of all precisions | ||||
|     prec = maximum $ map asprecision ss | ||||
|     prec = maximumStrict $ map asprecision ss | ||||
|     mdec  = Just $ headDef '.' $ catMaybes $ map asdecimalpoint ss | ||||
|     -- precision is that of first amount with a decimal point | ||||
|     -- (mdec, prec) = | ||||
| @ -842,8 +842,8 @@ journalDateSpan secondary j | ||||
|     | null ts   = DateSpan Nothing Nothing | ||||
|     | otherwise = DateSpan (Just earliest) (Just $ addDays 1 latest) | ||||
|     where | ||||
|       earliest = minimum dates | ||||
|       latest   = maximum dates | ||||
|       earliest = minimumStrict dates | ||||
|       latest   = maximumStrict dates | ||||
|       dates    = pdates ++ tdates | ||||
|       tdates   = map (if secondary then transactionDate2 else tdate) ts | ||||
|       pdates   = concatMap (catMaybes . map (if secondary then (Just . postingDate2) else pdate) . tpostings) ts | ||||
|  | ||||
| @ -126,7 +126,7 @@ accountNamesFromPostings :: [Posting] -> [AccountName] | ||||
| accountNamesFromPostings = nub . map paccount | ||||
| 
 | ||||
| sumPostings :: [Posting] -> MixedAmount | ||||
| sumPostings = sum . map pamount | ||||
| sumPostings = sumStrict . map pamount | ||||
| 
 | ||||
| -- | Remove all prices of a posting | ||||
| removePrices :: Posting -> Posting | ||||
|  | ||||
| @ -393,10 +393,10 @@ inferBalancingAmount update t@Transaction{tpostings=ps} | ||||
|            return t{tpostings=postings} | ||||
|   where | ||||
|     printerr s = intercalate "\n" [s, showTransactionUnelided t] | ||||
|     ((amountfulrealps, amountlessrealps), realsum) = | ||||
|       (partition hasAmount (realPostings t), sum $ map pamount amountfulrealps) | ||||
|     ((amountfulbvps, amountlessbvps), bvsum)       = | ||||
|       (partition hasAmount (balancedVirtualPostings t), sum $ map pamount amountfulbvps) | ||||
|     (amountfulrealps, amountlessrealps) = partition hasAmount (realPostings t) | ||||
|     realsum = sumStrict $ map pamount amountfulrealps | ||||
|     (amountfulbvps, amountlessbvps) = partition hasAmount (balancedVirtualPostings t) | ||||
|     bvsum = sumStrict $ map pamount amountfulbvps | ||||
|     inferamount p@Posting{ptype=RegularPosting} | ||||
|      | not (hasAmount p) = updateAmount p realsum | ||||
|     inferamount p@Posting{ptype=BalancedVirtualPosting} | ||||
| @ -460,7 +460,7 @@ priceInferrerFor t pt = inferprice | ||||
|     pmixedamounts  = map pamount postings | ||||
|     pamounts       = concatMap amounts pmixedamounts | ||||
|     pcommodities   = map acommodity pamounts | ||||
|     sumamounts     = amounts $ sum pmixedamounts -- sum normalises to one amount per commodity & price | ||||
|     sumamounts     = amounts $ sumStrict pmixedamounts -- sum normalises to one amount per commodity & price | ||||
|     sumcommodities = map acommodity sumamounts | ||||
|     sumprices      = filter (/=NoPrice) $ map aprice sumamounts | ||||
|     caninferprices = length sumcommodities == 2 && null sumprices | ||||
|  | ||||
| @ -130,7 +130,7 @@ instance NFData Price | ||||
| data AmountStyle = AmountStyle { | ||||
|       ascommodityside   :: Side,                 -- ^ does the symbol appear on the left or the right ? | ||||
|       ascommodityspaced :: Bool,                 -- ^ space between symbol and quantity ? | ||||
|       asprecision       :: Int,                  -- ^ number of digits displayed after the decimal point | ||||
|       asprecision       :: !Int,                 -- ^ number of digits displayed after the decimal point | ||||
|       asdecimalpoint    :: Maybe Char,           -- ^ character used as decimal point: period or comma. Nothing means "unspecified, use default" | ||||
|       asdigitgroups     :: Maybe DigitGroupStyle -- ^ style for displaying digit groups, if any | ||||
| } deriving (Eq,Ord,Read,Show,Typeable,Data,Generic) | ||||
|  | ||||
| @ -34,7 +34,7 @@ module Hledger.Utils (---- provide these frequently used modules - or not, for c | ||||
| where | ||||
| import Control.Monad (liftM) | ||||
| -- import Data.Char | ||||
| -- import Data.List | ||||
| import Data.List | ||||
| -- import Data.Maybe | ||||
| -- import Data.PPrint | ||||
| import Data.Text (Text) | ||||
| @ -173,4 +173,39 @@ readFileOrStdinAnyLineEnding f = do | ||||
| -- | Total version of maximum, for integral types, giving 0 for an empty list. | ||||
| maximum' :: Integral a => [a] -> a | ||||
| maximum' [] = 0 | ||||
| maximum' xs = maximum xs | ||||
| maximum' xs = maximumStrict xs | ||||
| 
 | ||||
| -- | Strict version of sum that doesn’t leak space | ||||
| {-# INLINABLE sumStrict #-} | ||||
| sumStrict :: Num a => [a] -> a | ||||
| sumStrict = foldl' (+) 0 | ||||
| 
 | ||||
| -- | Strict version of maximum that doesn’t leak space | ||||
| {-# INLINABLE maximumStrict #-} | ||||
| maximumStrict :: Ord a => [a] -> a | ||||
| maximumStrict = foldl1' max | ||||
| 
 | ||||
| -- | Strict version of minimum that doesn’t leak space | ||||
| {-# INLINABLE minimumStrict #-} | ||||
| minimumStrict :: Ord a => [a] -> a | ||||
| minimumStrict = foldl1' min | ||||
| 
 | ||||
| -- | This is a version of sequence based on difference lists. It is | ||||
| -- slightly faster but we mostly use it because it uses the heap | ||||
| -- instead of the stack. This has the advantage that Neil Mitchell’s | ||||
| -- trick of limiting the stack size to discover space leaks doesn’t | ||||
| -- show this as a false positive. | ||||
| {-# INLINABLE sequence' #-} | ||||
| sequence' :: Monad f => [f a] -> f [a] | ||||
| sequence' ms = do | ||||
|   h <- go id ms | ||||
|   return (h []) | ||||
|   where | ||||
|     go h [] = return h | ||||
|     go h (m:ms) = do | ||||
|       x <- m | ||||
|       go (h . (x :)) ms | ||||
| 
 | ||||
| {-# INLINABLE mapM' #-} | ||||
| mapM' :: Monad f => (a -> f b) -> [a] -> f [b] | ||||
| mapM' f = sequence' . map f | ||||
|  | ||||
| @ -90,8 +90,8 @@ postingsReportItemAsCsvRecord (_, _, _, p, b) = [idx,date,desc,acct,amt,bal] | ||||
| postingsReportAsText :: CliOpts -> PostingsReport -> String | ||||
| postingsReportAsText opts (_,items) = unlines $ map (postingsReportItemAsText opts amtwidth balwidth) items | ||||
|   where | ||||
|     amtwidth = maximum $ 12 : map (strWidth . showMixedAmount . itemamt) items | ||||
|     balwidth = maximum $ 12 : map (strWidth . showMixedAmount . itembal) items | ||||
|     amtwidth = maximumStrict $ 12 : map (strWidth . showMixedAmount . itemamt) items | ||||
|     balwidth = maximumStrict $ 12 : map (strWidth . showMixedAmount . itembal) items | ||||
|     itemamt (_,_,_,Posting{pamount=a},_) = a | ||||
|     itembal (_,_,_,_,a) = a | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user