///|
/// Numeric locale conventions for formatter strings, independent of rc defaults.
pub struct NumericLocale {
  priv decimal_point : String
  priv thousands_sep : String
  priv grouping : Array[Int32]
}

///|
/// Retain the grouping array; zero repeats a group and 127 ends grouping.
pub fn NumericLocale::new(
  decimal_point~ : String = ".",
  thousands_sep~ : String = "",
  grouping~ : Array[Int32] = [],
) -> NumericLocale {
  { decimal_point, thousands_sep, grouping, }
}

///|
pub fn NumericLocale::decimal_point(self : NumericLocale) -> String {
  self.decimal_point
}

///|
pub fn NumericLocale::thousands_sep(self : NumericLocale) -> String {
  self.thousands_sep
}

///|
pub fn NumericLocale::grouping(self : NumericLocale) -> Array[Int32] {
  self.grouping
}

///|
let current_numeric_locale : @ref.Ref[NumericLocale] = @ref.Ref(
  NumericLocale::new(),
)

///|
pub fn numeric_locale() -> NumericLocale {
  current_numeric_locale.val
}

///|
pub fn set_numeric_locale(value : NumericLocale) -> Unit {
  current_numeric_locale.val = value
}