// 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;

/// 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});

  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});
}
