class ReeDatetime::GeneralDiff

def call(start_time, end_time, **opts)

def call(start_time, end_time, **opts)
  results = []
  end_time = end_time.to_time
  opts = slice(opts, [:round_mode])
  y_delta = years_diff(start_time, end_time, **opts)
  results << y_delta
  past_time = start_time.to_time + y_delta * SECONDS_IN_INTERVAL[:years]
  m_delta = end_time > past_time ? months_diff(past_time, end_time, **opts) : 0
  results << m_delta
  past_time += m_delta * SECONDS_IN_INTERVAL[:months]
  w_delta = end_time > past_time ? weeks_diff(past_time, end_time, **opts) : 0
  results << w_delta
  past_time += w_delta * SECONDS_IN_INTERVAL[:weeks]
  d_delta = end_time > past_time ? days_diff(past_time, end_time, **opts) : 0
  results << d_delta
  past_time += d_delta * SECONDS_IN_INTERVAL[:days]
  h_delta = end_time > past_time ? hours_diff(past_time, end_time, **opts) : 0
  results << h_delta
  past_time += h_delta * SECONDS_IN_INTERVAL[:hours]
  m_delta = end_time > past_time ? minutes_diff(past_time, end_time, **opts) : 0
  results << m_delta
  past_time += m_delta * SECONDS_IN_INTERVAL[:minutes]
  s_delta = end_time > past_time ? seconds_diff(past_time, end_time, **opts) : 0
  results << s_delta * SECONDS_IN_INTERVAL[:seconds]
  Hash[INTERVALS.zip(results)]
end