///|
// date2num checks only the first element's awareness. First-aware mixed arrays
// interpret later naive dates using host rules; first-naive arrays pass through
// NumPy's datetime64 conversion without Python's aware UTC-overflow guard.
fn date_values_to_numbers(
  values : Array[RRuleDateTime],
  context : DateParserContext?,
) -> Array[Double] raise DateError {
  if values.is_empty() {
    return []
  }
  let mut selected_context = context
  let dates = if values[0].is_naive() {
    // NumPy's Python datetime -> datetime64 path truncates utcoffset to whole
    // minutes, toward zero. The first-aware path below normalizes exactly.
    values.map(value => {
      let date = value.date()
      { ..date, offset_seconds: date.offset_seconds / 60 * 60, }
    })
  } else {
    values.map(value => {
      let date = if value.is_naive() {
        let host = match selected_context {
          Some(context) => context
          None => {
            let host = DateParserContext::system()
            selected_context = Some(host)
            host
          }
        }
        host.interpret_naive(value.date(), value.fold)
      } else {
        value.date()
      }
      parser_check_utc(date)
      date
    })
  }
  ignore(selected_epoch())
  dates.map(value => value.to_ordinal())
}