Source code for policyengine_core.taxscales.amount_tax_scale_like
import abc
import bisect
import os
import typing
from policyengine_core import tools
from policyengine_core.taxscales.tax_scale_like import TaxScaleLike
[docs]class AmountTaxScaleLike(TaxScaleLike, abc.ABC):
"""
Base class for various types of amount-based tax scales: single amount,
marginal amount...
"""
amounts: typing.List
def __init__(
self,
name: typing.Optional[str] = None,
option: typing.Any = None,
unit: typing.Any = None,
) -> None:
super().__init__(name, option, unit)
self.amounts = []
def __repr__(self) -> str:
return tools.indent(
os.linesep.join(
[
f"- threshold: {threshold}{os.linesep} amount: {amount}"
for (threshold, amount) in zip(
self.thresholds, self.amounts
)
]
)
)
def add_bracket(
self,
threshold: int,
amount: typing.Union[int, float],
) -> None:
if threshold in self.thresholds:
i = self.thresholds.index(threshold)
self.amounts[i] += amount
else:
i = bisect.bisect_left(self.thresholds, threshold)
self.thresholds.insert(i, threshold)
self.amounts.insert(i, amount)
def to_dict(self) -> dict:
return {
str(threshold): self.amounts[index]
for index, threshold in enumerate(self.thresholds)
}