Functional Weave
Code in Rust

dates.overlap@1.0.0

impl/python.py

908 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 .dates_add_days import epoch_day_from_iso  ← from dates.add-days ^1.0.0 · built alongside by fune


def overlap_days(a_start: str, a_end: str, b_start: str, b_end: str, end_inclusive: bool) -> int:
    """Days two ranges have in common.

    ``end_inclusive`` says whether each end date is the range's last day (a
    statement period) or the day after it (a half-open range, a hotel stay);
    both ranges use the same convention.
    """
    a0 = epoch_day_from_iso(a_start)
    a1 = epoch_day_from_iso(a_end)
    b0 = epoch_day_from_iso(b_start)
    b1 = epoch_day_from_iso(b_end)
    if a1 < a0:
        raise ValueError("range A starts %s, after its end %s" % (a_start, a_end))
    if b1 < b0:
        raise ValueError("range B starts %s, after its end %s" % (b_start, b_end))
    # An inclusive end is the half-open end one day later.
    extra = 1 if end_inclusive else 0
    days = min(a1, b1) + extra - max(a0, b0)
    return days if days > 0 else 0