Functional Weave
Code in Python

money.split-even@1.0.0

impl/python.py

984 bytes · the Python implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

from typing import List

from .money_amount import Money, money  ← from money.amount ^1.0.0 · built alongside by fune


def split_even(amount: Money, parts: int) -> List[Money]:
    """Split ``amount`` into ``parts`` near-equal shares that sum to exactly ``amount``.

    The leftover minor units go one each to the first shares, and a negative
    amount splits as the mirror image of the positive one, so a refund undoes
    the original split share for share.
    """
    if isinstance(parts, bool) or not isinstance(parts, int):
        raise TypeError("parts must be a whole number, received %r" % (parts,))
    if parts < 1:
        raise ValueError("parts must be at least 1, received %d" % (parts,))
    sign = -1 if amount.minor < 0 else 1
    # divmod on the magnitude: Python's floor division would round a negative
    # amount the other way and put the odd penny last.
    base, leftover = divmod(abs(amount.minor), parts)
    return [money(sign * (base + (1 if i < leftover else 0)), amount.currency) for i in range(parts)]