// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library number_symbols;

// Suppress naming issues as changes would be breaking.
// ignore_for_file: avoid_types_as_parameter_names, non_constant_identifier_names

/// This holds onto information about how a particular locale formats
/// numbers. It contains strings for things like the decimal separator, digit to
/// use for "0" and infinity. We expect the data for instances to be generated
/// out of ICU or a similar reference source.
class NumberSymbols {
  final String NAME;
  final String DECIMAL_SEP,
      GROUP_SEP,
      PERCENT,
      ZERO_DIGIT,
      PLUS_SIGN,
      MINUS_SIGN,
      EXP_SYMBOL,
      PERMILL,
      INFINITY,
      NAN,
      DECIMAL_PATTERN,
      SCIENTIFIC_PATTERN,
      PERCENT_PATTERN,
      CURRENCY_PATTERN,
      DEF_CURRENCY_CODE;

  const NumberSymbols(
      {this.NAME,
      this.DECIMAL_SEP,
      this.GROUP_SEP,
      this.PERCENT,
      this.ZERO_DIGIT,
      this.PLUS_SIGN,
      this.MINUS_SIGN,
      this.EXP_SYMBOL,
      this.PERMILL,
      this.INFINITY,
      this.NAN,
      this.DECIMAL_PATTERN,
      this.SCIENTIFIC_PATTERN,
      this.PERCENT_PATTERN,
      this.CURRENCY_PATTERN,
      this.DEF_CURRENCY_CODE});

  String toString() => NAME;
}

class CompactNumberSymbols {
  final Map<int, String> COMPACT_DECIMAL_SHORT_PATTERN;
  final Map<int, String> COMPACT_DECIMAL_LONG_PATTERN;
  final Map<int, String> COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN;
  CompactNumberSymbols(
      {this.COMPACT_DECIMAL_SHORT_PATTERN,
      this.COMPACT_DECIMAL_LONG_PATTERN,
      this.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN});
}
