refactor
This commit is contained in:
		
							parent
							
								
									ed44dc3cac
								
							
						
					
					
						commit
						4cd2364154
					
				| @ -113,39 +113,6 @@ getPostings accept historicalps enteredps = do | ||||
|       validateamount = Just $ \s -> (null s && not (null enteredrealps)) | ||||
|                                    || isRight (parse (someamount>>many spacenonewline>>eof) "" s) | ||||
| 
 | ||||
| -- XXX urgh.. just a proof of concept, refactor | ||||
| sumMixedAmountsPreservingHighestPrecision :: [MixedAmount] -> MixedAmount | ||||
| sumMixedAmountsPreservingHighestPrecision ms = foldl' (+~) 0 ms | ||||
|     where (+~) (Mixed as) (Mixed bs) = normaliseMixedAmountPreservingHighestPrecision $ Mixed $ as ++ bs | ||||
| 
 | ||||
| normaliseMixedAmountPreservingHighestPrecision :: MixedAmount -> MixedAmount | ||||
| normaliseMixedAmountPreservingHighestPrecision (Mixed as) = Mixed as'' | ||||
|     where | ||||
|       as'' = map sumSamePricedAmountsPreservingPriceAndHighestPrecision $ group $ sort as' | ||||
|       sort = sortBy cmpsymbolandprice | ||||
|       cmpsymbolandprice a1 a2 = compare (sym a1,price a1) (sym a2,price a2) | ||||
|       group = groupBy samesymbolandprice | ||||
|       samesymbolandprice a1 a2 = (sym a1 == sym a2) && (price a1 == price a2) | ||||
|       sym = symbol . commodity | ||||
|       as' | null nonzeros = [head $ zeros ++ [nullamt]] | ||||
|           | otherwise = nonzeros | ||||
|       (zeros,nonzeros) = partition isReallyZeroAmount as | ||||
| 
 | ||||
| sumSamePricedAmountsPreservingPriceAndHighestPrecision [] = nullamt | ||||
| sumSamePricedAmountsPreservingPriceAndHighestPrecision as = (sumAmountsPreservingHighestPrecision as){price=price $ head as} | ||||
| 
 | ||||
| sumAmountsPreservingHighestPrecision :: [Amount] -> Amount | ||||
| sumAmountsPreservingHighestPrecision as = foldl' (+~) 0 as | ||||
|     where (+~) = amountopPreservingHighestPrecision (+) | ||||
| 
 | ||||
| amountopPreservingHighestPrecision :: (Double -> Double -> Double) -> Amount -> Amount -> Amount | ||||
| amountopPreservingHighestPrecision op a@(Amount ac@Commodity{precision=ap} _ _) (Amount bc@Commodity{precision=bp} bq _) =  | ||||
|     Amount c q Nothing | ||||
|     where | ||||
|       q = quantity (convertAmountTo bc a) `op` bq | ||||
|       c = if ap > bp then ac else bc | ||||
| -- | ||||
| 
 | ||||
| -- | Prompt for and read a string value, optionally with a default value | ||||
| -- and a validator. A validator causes the prompt to repeat until the | ||||
| -- input is valid. May also raise an EOF exception if control-d is pressed. | ||||
|  | ||||
| @ -228,6 +228,11 @@ normaliseMixedAmount (Mixed as) = Mixed as'' | ||||
|           | otherwise = nonzeros | ||||
|       (zeros,nonzeros) = partition isReallyZeroAmount as | ||||
| 
 | ||||
| -- various sum variants.. | ||||
| 
 | ||||
| sumAmountsDiscardingPrice [] = nullamt | ||||
| sumAmountsDiscardingPrice as = (sum as){price=Nothing} | ||||
| 
 | ||||
| sumSamePricedAmountsPreservingPrice [] = nullamt | ||||
| sumSamePricedAmountsPreservingPrice as = (sum as){price=price $ head as} | ||||
| 
 | ||||
| @ -246,8 +251,37 @@ normaliseMixedAmountIgnoringPrice (Mixed as) = Mixed as'' | ||||
|           | otherwise = nonzeros | ||||
|           where (zeros,nonzeros) = partition isZeroAmount as | ||||
| 
 | ||||
| sumAmountsDiscardingPrice [] = nullamt | ||||
| sumAmountsDiscardingPrice as = (sum as){price=Nothing} | ||||
| sumMixedAmountsPreservingHighestPrecision :: [MixedAmount] -> MixedAmount | ||||
| sumMixedAmountsPreservingHighestPrecision ms = foldl' (+~) 0 ms | ||||
|     where (+~) (Mixed as) (Mixed bs) = normaliseMixedAmountPreservingHighestPrecision $ Mixed $ as ++ bs | ||||
| 
 | ||||
| normaliseMixedAmountPreservingHighestPrecision :: MixedAmount -> MixedAmount | ||||
| normaliseMixedAmountPreservingHighestPrecision (Mixed as) = Mixed as'' | ||||
|     where | ||||
|       as'' = map sumSamePricedAmountsPreservingPriceAndHighestPrecision $ group $ sort as' | ||||
|       sort = sortBy cmpsymbolandprice | ||||
|       cmpsymbolandprice a1 a2 = compare (sym a1,price a1) (sym a2,price a2) | ||||
|       group = groupBy samesymbolandprice | ||||
|       samesymbolandprice a1 a2 = (sym a1 == sym a2) && (price a1 == price a2) | ||||
|       sym = symbol . commodity | ||||
|       as' | null nonzeros = [head $ zeros ++ [nullamt]] | ||||
|           | otherwise = nonzeros | ||||
|       (zeros,nonzeros) = partition isReallyZeroAmount as | ||||
| 
 | ||||
| sumSamePricedAmountsPreservingPriceAndHighestPrecision [] = nullamt | ||||
| sumSamePricedAmountsPreservingPriceAndHighestPrecision as = (sumAmountsPreservingHighestPrecision as){price=price $ head as} | ||||
| 
 | ||||
| sumAmountsPreservingHighestPrecision :: [Amount] -> Amount | ||||
| sumAmountsPreservingHighestPrecision as = foldl' (+~) 0 as | ||||
|     where (+~) = amountopPreservingHighestPrecision (+) | ||||
| 
 | ||||
| amountopPreservingHighestPrecision :: (Double -> Double -> Double) -> Amount -> Amount -> Amount | ||||
| amountopPreservingHighestPrecision op a@(Amount ac@Commodity{precision=ap} _ _) (Amount bc@Commodity{precision=bp} bq _) =  | ||||
|     Amount c q Nothing | ||||
|     where | ||||
|       q = quantity (convertAmountTo bc a) `op` bq | ||||
|       c = if ap > bp then ac else bc | ||||
| -- | ||||
| 
 | ||||
| -- | Convert a mixed amount's component amounts to the commodity of their | ||||
| -- saved price, if any. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user