alignTo method

Hora alignTo(
  1. int interval,
  2. TimePrecision precision
)

Aligns this date to a grid of the specified interval.

For example, alignTo(15, TimePrecision.minute) aligns to 15-minute intervals (0, 15, 30, 45 minutes).

Implementation

Hora alignTo(int interval, TimePrecision precision) {
  if (interval <= 0) {
    throw ArgumentError.value(interval, 'interval', 'Must be positive.');
  }

  final truncated = truncateTo(precision);
  final value = switch (precision) {
    TimePrecision.year => year,
    TimePrecision.quarter => quarter,
    TimePrecision.month => month,
    TimePrecision.week => isoWeek,
    TimePrecision.day => day,
    TimePrecision.hour => hour,
    TimePrecision.minute => minute,
    TimePrecision.second => second,
    TimePrecision.millisecond => millisecond,
  };

  final base = switch (precision) {
    TimePrecision.quarter ||
    TimePrecision.month ||
    TimePrecision.week ||
    TimePrecision.day =>
      1,
    _ => 0,
  };

  final aligned = ((value - base) ~/ interval) * interval + base;
  final diff = value - aligned;

  return truncated.subtract(diff, precision.toUnit);
}