Functional Weave
Code in Python

charts.shape@1.0.1

impl/python/bar_rects.py

1,310 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, Sequence

from .charts_shape_types import BarSpec, Orientation, Rect
from .math_round_float import round_float  ← from math.round-float ^1.0.0 · built alongside by fune


def bar_rects(bars: Sequence[BarSpec], orientation: Orientation) -> List[Rect]:
    """Rectangles for bars. Edges are rounded to 2 places and sizes are the
    differences of the rounded edges, so bars that share an edge share it
    exactly, and a negative bar's height is still positive."""
    if orientation not in ("vertical", "horizontal"):
        raise ValueError("orientation must be vertical or horizontal, received %r" % (orientation,))
    out: List[Rect] = []
    for bar in bars:
        if not bar.thickness >= 0:
            raise ValueError("bar thickness must not be negative, received %r" % (bar.thickness,))
        band = float(bar.band)
        a0 = round_float(band, 2)
        a1 = round_float(band + float(bar.thickness), 2)
        v0 = round_float(min(float(bar.base), float(bar.value)), 2)
        v1 = round_float(max(float(bar.base), float(bar.value)), 2)
        across = round_float(a1 - a0, 2)
        along = round_float(v1 - v0, 2)
        if orientation == "vertical":
            out.append(Rect(x=a0, y=v0, width=across, height=along))
        else:
            out.append(Rect(x=v0, y=a0, width=along, height=across))
    return out