///|
fn validate_date_formatter_axis(
  axis : @axis.Axis,
) -> Unit raise @core.DataError {
  if axis.scale().is_nonlinear() {
    raise @core.DataError::InvalidTicks(
      message="date axis cannot be combined with a non-linear scale",
    )
  }
  if axis.categories() is Some(_) {
    raise @core.DataError::InvalidTicks(
      message="date axis cannot be combined with category data",
    )
  }
}

///|
/// Set a copied date formatter on every axes sharing this x coordinate.
/// ConciseDateFormatter::as_formatter supplies batch labels and shared date text.
pub fn Axes::set_x_date_formatter(
  self : Axes,
  formatter : @date.DateFormatter,
) -> Unit raise @core.DataError {
  let states = self.x_group_states()
  for state in states {
    validate_date_formatter_axis(state.val.x_axis)
    state.val.x_axis.validate_date_converter()
  }
  for state in states {
    state.val.x_axis.set_date_formatter(formatter)
  }
}

///|
/// Set a copied date formatter on every axes sharing this y coordinate.
pub fn Axes::set_y_date_formatter(
  self : Axes,
  formatter : @date.DateFormatter,
) -> Unit raise @core.DataError {
  let states = self.y_group_states()
  for state in states {
    validate_date_formatter_axis(state.val.y_axis)
    state.val.y_axis.validate_date_converter()
  }
  for state in states {
    state.val.y_axis.set_date_formatter(formatter)
  }
}

///|
/// Set a date formatter on the default x axis, including shared axes.
pub fn Figure::set_x_date_formatter(
  self : Figure,
  formatter : @date.DateFormatter,
) -> Unit raise @core.DataError {
  self.axes().set_x_date_formatter(formatter)
}

///|
/// Set a date formatter on the default y axis, including shared axes.
pub fn Figure::set_y_date_formatter(
  self : Figure,
  formatter : @date.DateFormatter,
) -> Unit raise @core.DataError {
  self.axes().set_y_date_formatter(formatter)
}