from dataclasses import dataclass from datetime import date, timedelta from typing import List, Union @dataclass class DateRange: start: date end: date def __init__(self, start: date, end: date): self.start = start or end self.end = end or start def merge_date_ranges(date_ranges: List[DateRange]): combined_ranges = [] new_range_item_start = None new_range_item_end = None length = len(date_ranges) for i, range_item in enumerate(date_ranges): current_range_start = range_item.start current_range_end = range_item.end if new_range_item_start is None: new_range_item_start = current_range_start new_range_item_end = current_range_end elif new_range_item_end >= current_range_start: new_range_item_end = max(current_range_end, new_range_item_end) else: combined_ranges.append((new_range_item_start, new_range_item_end)) new_range_item_start = current_range_start new_range_item_end = current_range_end if i + 1 == length: combined_ranges.append((new_range_item_start, new_range_item_end)) return [DateRange(date_range[0], date_range[1]) for date_range in combined_ranges] def dates_between(start_date: date, end_date: date): for n in range(int((end_date - start_date).days + 1)): yield start_date + timedelta(n) def compare_dates(date_1: Union[str, date], date_2: Union[str, date]) -> bool: if type(date_1) == date: date_1 = date_1.isoformat() if type(date_2) == date: date_2 = date_2.isoformat() return date_1 == date_2