package gw.financials
uses java.util.Collection
uses java.util.List
class LegacyTransactionReducer implements TransactionReducer {
static var _reductionCount : int = 0
public static property get ReductionCount() : int { //count total times reduce is called
return _reductionCount
}
var _orderingFunction : block (txns : Collection>) : WrappedProratable
var _transactions : List>
var _defaultProrater : Prorater
construct(prorater : Prorater, orderingFunction(txns : Collection>) : WrappedProratable) {
_defaultProrater = prorater
_orderingFunction = orderingFunction
_transactions = {}
}
override function add( t: WrappedProratable ) : TransactionReducer {
_transactions.add(t)
return this
}
override function reduce() : List> {
_reductionCount = _reductionCount + 1
var result : List> = {}
var segmenter = new DateRangeSegmenter>()
for (t in _transactions) {
segmenter.add( t.Start, t.End, t )
}
segmenter.segment( \ start, end, txns -> {
var elements = txns.map( \ t -> {
var _prorater = t.getProrater(_defaultProrater)
return _prorater.prorate( t.Start, t.End, start, end, t.Amount )
})
if (elements.Empty) {
return
}
var sum = elements.sumWithAtLeastOneNonNullCurrency()
if (not sum.IsZero) {
var firstTransaction = _orderingFunction(txns)
result.add(firstTransaction.subPeriod( start, end, sum))
}
})
return result
}
}