///|
/// Date conversion with configurable six-level concise axis labels.
pub struct ConciseDateConverter {
  priv converter : DateConverter
}

///|
/// Copy optional format arrays. As in the pinned upstream constructor, its
/// superclass initialization resets interval_multiples to true. Format-array
/// validation occurs in axisinfo when the formatter is constructed.
pub fn ConciseDateConverter::new(
  formats? : Array[String],
  zero_formats? : Array[String],
  offset_formats? : Array[String],
  show_offset~ : Bool = true,
  interval_multiples~ : Bool = true,
) -> ConciseDateConverter {
  ignore(interval_multiples)
  {
    converter: {
      mode: ConciseConverter(
        formats.map(values => values.copy()),
        zero_formats.map(values => values.copy()),
        offset_formats.map(values => values.copy()),
        show_offset,
      ),
      multiples: true,
    },
  }
}

///|
pub fn ConciseDateConverter::as_converter(
  self : ConciseDateConverter,
) -> DateConverter {
  self.converter.copy()
}

///|
pub fn ConciseDateConverter::axisinfo(
  self : ConciseDateConverter,
  unit? : DateTimeZone,
) -> DateAxisInfo raise DateError {
  self.converter.axisinfo(unit?)
}

///|
pub fn ConciseDateConverter::convert(
  self : ConciseDateConverter,
  values : Array[DateTime],
) -> Array[Double] {
  self.converter.convert(values)
}

///|
pub fn ConciseDateConverter::convert_value(
  self : ConciseDateConverter,
  value : DateTime,
) -> Double {
  self.converter.convert_value(value)
}

///|
pub fn ConciseDateConverter::default_unit(
  self : ConciseDateConverter,
  value : DateTime,
) -> DateTimeZone {
  self.converter.default_unit(value)
}

///|
pub fn ConciseDateConverter::default_units(
  self : ConciseDateConverter,
  values : Array[DateTime],
) -> DateTimeZone? {
  self.converter.default_units(values)
}