// ISO 4217 currency table: 165 currencies.
//
// Generated by `tools/generate_currency_table.mjs`; do not edit by hand.
// See SOURCES.md for the data sets, their versions and their licences.
//
//   * alphabetic code, numeric code, minor unit and name
//       datasets/currency-codes (derived from ISO 4217, PDDL-1.0)
//   * display digits, cash digits, cash rounding step and symbol
//       Unicode CLDR, unicode-org/cldr-json (Unicode License v3)
//
// ISO 4217 minor units (`exponent`) and CLDR display digits disagree for the
// currencies whose smallest unit is no longer in circulation, HUF and AFN among
// them. Both are kept: `exponent` is the exactness boundary an amount is stored
// with, `display_digits` is what CLDR recommends for a display.
//
// Currencies that have no ISO 4217 minor unit are deliberately absent: the
// metals (XAU, XAG, XPT, XPD), the special drawing right (XDR), the fund and
// testing codes (XBA..XBD, XSU, XUA, XTS) and `XXX`. They carry no defined
// number of decimal places, so a fixed-point amount cannot be formed from them
// without inventing one. Build them with `Currency::custom` when needed.
//
// The table is sorted by alphabetic code, which is the order `Currency::all`
// and `Currency::known_codes` report, so listings stay stable across runs.

///|
/// One table row. A function rather than a struct literal so that the table
/// below reads as one line per currency.
fn row(
  code : String,
  numeric : Int32,
  exponent : Int32,
  display_digits : Int32,
  cash_exponent : Int32,
  cash_step : Int32,
  name : String,
  symbol : String,
) -> Currency {
  {
    code,
    numeric,
    exponent,
    display_digits,
    cash_exponent,
    cash_step,
    name,
    symbol,
  }
}

///|
let table : Array[Currency] = [
  row("AED", 784, 2, 2, 2, 1, "United Arab Emirates Dirham", "AED"),
  row("AFN", 971, 2, 0, 0, 1, "Afghan Afghani", "AFN"),
  row("ALL", 8, 2, 0, 0, 1, "Albanian Lek", "ALL"),
  row("AMD", 51, 2, 2, 0, 1, "Armenian Dram", "AMD"),
  row("AOA", 973, 2, 2, 2, 1, "Angolan Kwanza", "AOA"),
  row("ARS", 32, 2, 2, 2, 1, "Argentine Peso", "ARS"),
  row("AUD", 36, 2, 2, 2, 1, "Australian Dollar", "A$"),
  row("AWG", 533, 2, 2, 2, 1, "Aruban Florin", "AWG"),
  row("AZN", 944, 2, 2, 2, 1, "Azerbaijani Manat", "AZN"),
  row("BAM", 977, 2, 2, 2, 1, "Bosnia-Herzegovina Convertible Mark", "BAM"),
  row("BBD", 52, 2, 2, 2, 1, "Barbadian Dollar", "BBD"),
  row("BDT", 50, 2, 2, 2, 1, "Bangladeshi Taka", "BDT"),
  row("BHD", 48, 3, 3, 3, 1, "Bahraini Dinar", "BHD"),
  row("BIF", 108, 0, 0, 0, 1, "Burundian Franc", "BIF"),
  row("BMD", 60, 2, 2, 2, 1, "Bermudan Dollar", "BMD"),
  row("BND", 96, 2, 2, 2, 1, "Brunei Dollar", "BND"),
  row("BOB", 68, 2, 2, 2, 1, "Bolivian Boliviano", "BOB"),
  row("BOV", 984, 2, 2, 2, 1, "Bolivian Mvdol", ""),
  row("BRL", 986, 2, 2, 2, 1, "Brazilian Real", "R$"),
  row("BSD", 44, 2, 2, 2, 1, "Bahamian Dollar", "BSD"),
  row("BTN", 64, 2, 2, 2, 1, "Bhutanese Ngultrum", "BTN"),
  row("BWP", 72, 2, 2, 2, 1, "Botswanan Pula", "BWP"),
  row("BYN", 933, 2, 2, 2, 1, "Belarusian Ruble", "BYN"),
  row("BZD", 84, 2, 2, 2, 1, "Belize Dollar", "BZD"),
  row("CAD", 124, 2, 2, 2, 5, "Canadian Dollar", "CA$"),
  row("CDF", 976, 2, 2, 2, 1, "Congolese Franc", "CDF"),
  row("CHE", 947, 2, 2, 2, 1, "WIR Euro", ""),
  row("CHF", 756, 2, 2, 2, 5, "Swiss Franc", "CHF"),
  row("CHW", 948, 2, 2, 2, 1, "WIR Franc", ""),
  row("CLF", 990, 4, 4, 4, 1, "Chilean Unit of Account (UF)", ""),
  row("CLP", 152, 0, 0, 0, 1, "Chilean Peso", "CLP"),
  row("CNY", 156, 2, 2, 2, 1, "Chinese Yuan", "CN¥"),
  row("COP", 170, 2, 0, 0, 1, "Colombian Peso", "COP"),
  row("COU", 970, 2, 2, 2, 1, "Colombian Real Value Unit", ""),
  row("CRC", 188, 2, 2, 0, 1, "Costa Rican Colón", "CRC"),
  row("CUP", 192, 2, 2, 2, 1, "Cuban Peso", "CUP"),
  row("CVE", 132, 2, 2, 2, 1, "Cape Verdean Escudo", "CVE"),
  row("CZK", 203, 2, 2, 0, 1, "Czech Koruna", "CZK"),
  row("DJF", 262, 0, 0, 0, 1, "Djiboutian Franc", "DJF"),
  row("DKK", 208, 2, 2, 2, 50, "Danish Krone", "DKK"),
  row("DOP", 214, 2, 2, 2, 1, "Dominican Peso", "DOP"),
  row("DZD", 12, 2, 2, 2, 1, "Algerian Dinar", "DZD"),
  row("EGP", 818, 2, 2, 2, 1, "Egyptian Pound", "EGP"),
  row("ERN", 232, 2, 2, 2, 1, "Eritrean Nakfa", "ERN"),
  row("ETB", 230, 2, 2, 2, 1, "Ethiopian Birr", "ETB"),
  row("EUR", 978, 2, 2, 2, 1, "Euro", "€"),
  row("FJD", 242, 2, 2, 2, 1, "Fijian Dollar", "FJD"),
  row("FKP", 238, 2, 2, 2, 1, "Falkland Islands Pound", "FKP"),
  row("GBP", 826, 2, 2, 2, 1, "British Pound", "£"),
  row("GEL", 981, 2, 2, 2, 1, "Georgian Lari", "GEL"),
  row("GHS", 936, 2, 2, 2, 1, "Ghanaian Cedi", "GHS"),
  row("GIP", 292, 2, 2, 2, 1, "Gibraltar Pound", "GIP"),
  row("GMD", 270, 2, 2, 2, 1, "Gambian Dalasi", "GMD"),
  row("GNF", 324, 0, 0, 0, 1, "Guinean Franc", "GNF"),
  row("GTQ", 320, 2, 2, 2, 1, "Guatemalan Quetzal", "GTQ"),
  row("GYD", 328, 2, 2, 0, 1, "Guyanaese Dollar", "GYD"),
  row("HKD", 344, 2, 2, 2, 1, "Hong Kong Dollar", "HK$"),
  row("HNL", 340, 2, 2, 2, 1, "Honduran Lempira", "HNL"),
  row("HTG", 332, 2, 2, 2, 1, "Haitian Gourde", "HTG"),
  row("HUF", 348, 2, 0, 0, 5, "Hungarian Forint", "HUF"),
  row("IDR", 360, 2, 0, 0, 1, "Indonesian Rupiah", "IDR"),
  row("ILS", 376, 2, 2, 2, 1, "Israeli New Shekel", "₪"),
  row("INR", 356, 2, 2, 2, 1, "Indian Rupee", "₹"),
  row("IQD", 368, 3, 0, 0, 1, "Iraqi Dinar", "IQD"),
  row("IRR", 364, 2, 0, 0, 1, "Iranian Rial", "IRR"),
  row("ISK", 352, 0, 0, 0, 1, "Icelandic Króna", "ISK"),
  row("JMD", 388, 2, 2, 2, 1, "Jamaican Dollar", "JMD"),
  row("JOD", 400, 3, 3, 3, 1, "Jordanian Dinar", "JOD"),
  row("JPY", 392, 0, 0, 0, 1, "Japanese Yen", "¥"),
  row("KES", 404, 2, 2, 2, 1, "Kenyan Shilling", "KES"),
  row("KGS", 417, 2, 2, 2, 1, "Kyrgyz Som", "KGS"),
  row("KHR", 116, 2, 2, 2, 1, "Cambodian Riel", "KHR"),
  row("KMF", 174, 0, 0, 0, 1, "Comorian Franc", "KMF"),
  row("KPW", 408, 2, 0, 0, 1, "North Korean Won", "KPW"),
  row("KRW", 410, 0, 0, 0, 1, "South Korean Won", "₩"),
  row("KWD", 414, 3, 3, 3, 1, "Kuwaiti Dinar", "KWD"),
  row("KYD", 136, 2, 2, 2, 1, "Cayman Islands Dollar", "KYD"),
  row("KZT", 398, 2, 2, 2, 1, "Kazakhstani Tenge", "KZT"),
  row("LAK", 418, 2, 0, 0, 1, "Laotian Kip", "LAK"),
  row("LBP", 422, 2, 0, 0, 1, "Lebanese Pound", "LBP"),
  row("LKR", 144, 2, 2, 2, 1, "Sri Lankan Rupee", "LKR"),
  row("LRD", 430, 2, 2, 2, 1, "Liberian Dollar", "LRD"),
  row("LSL", 426, 2, 2, 2, 1, "Lesotho Loti", "LSL"),
  row("LYD", 434, 3, 3, 3, 1, "Libyan Dinar", "LYD"),
  row("MAD", 504, 2, 2, 2, 1, "Moroccan Dirham", "MAD"),
  row("MDL", 498, 2, 2, 2, 1, "Moldovan Leu", "MDL"),
  row("MGA", 969, 2, 0, 0, 1, "Malagasy Ariary", "MGA"),
  row("MKD", 807, 2, 2, 2, 1, "Macedonian Denar", "MKD"),
  row("MMK", 104, 2, 0, 0, 1, "Myanmar Kyat", "MMK"),
  row("MNT", 496, 2, 2, 0, 1, "Mongolian Tugrik", "MNT"),
  row("MOP", 446, 2, 2, 2, 1, "Macanese Pataca", "MOP"),
  row("MRU", 929, 2, 2, 2, 1, "Mauritanian Ouguiya", "MRU"),
  row("MUR", 480, 2, 2, 0, 1, "Mauritian Rupee", "MUR"),
  row("MVR", 462, 2, 2, 2, 1, "Maldivian Rufiyaa", "MVR"),
  row("MWK", 454, 2, 2, 2, 1, "Malawian Kwacha", "MWK"),
  row("MXN", 484, 2, 2, 2, 1, "Mexican Peso", "MX$"),
  row("MXV", 979, 2, 2, 2, 1, "Mexican Investment Unit", ""),
  row("MYR", 458, 2, 2, 2, 1, "Malaysian Ringgit", "MYR"),
  row("MZN", 943, 2, 2, 2, 1, "Mozambican Metical", "MZN"),
  row("NAD", 516, 2, 2, 2, 1, "Namibian Dollar", "NAD"),
  row("NGN", 566, 2, 2, 2, 1, "Nigerian Naira", "NGN"),
  row("NIO", 558, 2, 2, 2, 1, "Nicaraguan Córdoba", "NIO"),
  row("NOK", 578, 2, 2, 0, 1, "Norwegian Krone", "NOK"),
  row("NPR", 524, 2, 2, 2, 1, "Nepalese Rupee", "NPR"),
  row("NZD", 554, 2, 2, 2, 1, "New Zealand Dollar", "NZ$"),
  row("OMR", 512, 3, 3, 3, 1, "Omani Rial", "OMR"),
  row("PAB", 590, 2, 2, 2, 1, "Panamanian Balboa", "PAB"),
  row("PEN", 604, 2, 2, 2, 1, "Peruvian Sol", "PEN"),
  row("PGK", 598, 2, 2, 2, 1, "Papua New Guinean Kina", "PGK"),
  row("PHP", 608, 2, 2, 2, 1, "Philippine Peso", "₱"),
  row("PKR", 586, 2, 0, 0, 1, "Pakistani Rupee", "PKR"),
  row("PLN", 985, 2, 2, 2, 1, "Polish Zloty", "PLN"),
  row("PYG", 600, 0, 0, 0, 1, "Paraguayan Guarani", "PYG"),
  row("QAR", 634, 2, 2, 2, 1, "Qatari Riyal", "QAR"),
  row("RON", 946, 2, 2, 2, 1, "Romanian Leu", "RON"),
  row("RSD", 941, 2, 2, 0, 1, "Serbian Dinar", "RSD"),
  row("RUB", 643, 2, 2, 2, 1, "Russian Ruble", "RUB"),
  row("RWF", 646, 0, 0, 0, 1, "Rwandan Franc", "RWF"),
  row("SAR", 682, 2, 2, 2, 1, "Saudi Riyal", "SAR"),
  row("SBD", 90, 2, 2, 2, 1, "Solomon Islands Dollar", "SBD"),
  row("SCR", 690, 2, 2, 2, 1, "Seychellois Rupee", "SCR"),
  row("SDG", 938, 2, 2, 2, 1, "Sudanese Pound", "SDG"),
  row("SEK", 752, 2, 2, 0, 1, "Swedish Krona", "SEK"),
  row("SGD", 702, 2, 2, 2, 1, "Singapore Dollar", "SGD"),
  row("SHP", 654, 2, 2, 2, 1, "St. Helena Pound", "SHP"),
  row("SLE", 925, 2, 2, 2, 1, "Sierra Leonean Leone", "SLE"),
  row("SOS", 706, 2, 0, 0, 1, "Somali Shilling", "SOS"),
  row("SRD", 968, 2, 2, 2, 1, "Surinamese Dollar", "SRD"),
  row("SSP", 728, 2, 2, 2, 1, "South Sudanese Pound", "SSP"),
  row("STN", 930, 2, 2, 2, 1, "São Tomé & Príncipe Dobra", "STN"),
  row("SVC", 222, 2, 2, 2, 1, "Salvadoran Colón", ""),
  row("SYP", 760, 2, 0, 0, 1, "Syrian Pound", "SYP"),
  row("SZL", 748, 2, 2, 2, 1, "Swazi Lilangeni", "SZL"),
  row("THB", 764, 2, 2, 2, 1, "Thai Baht", "THB"),
  row("TJS", 972, 2, 2, 2, 1, "Tajikistani Somoni", "TJS"),
  row("TMT", 934, 2, 2, 2, 1, "Turkmenistani Manat", "TMT"),
  row("TND", 788, 3, 3, 3, 1, "Tunisian Dinar", "TND"),
  row("TOP", 776, 2, 2, 2, 1, "Tongan Paʻanga", "TOP"),
  row("TRY", 949, 2, 2, 2, 1, "Turkish Lira", "TRY"),
  row("TTD", 780, 2, 2, 2, 1, "Trinidad & Tobago Dollar", "TTD"),
  row("TWD", 901, 2, 2, 0, 1, "New Taiwan Dollar", "NT$"),
  row("TZS", 834, 2, 2, 0, 1, "Tanzanian Shilling", "TZS"),
  row("UAH", 980, 2, 2, 2, 1, "Ukrainian Hryvnia", "UAH"),
  row("UGX", 800, 0, 0, 0, 1, "Ugandan Shilling", "UGX"),
  row("USD", 840, 2, 2, 2, 1, "US Dollar", "$"),
  row("USN", 997, 2, 2, 2, 1, "US Dollar (Next day)", ""),
  row("UYI", 940, 0, 0, 0, 1, "Uruguayan Peso (Indexed Units)", ""),
  row("UYU", 858, 2, 2, 2, 1, "Uruguayan Peso", "UYU"),
  row("UYW", 927, 4, 4, 4, 1, "Uruguayan Nominal Wage Index Unit", ""),
  row("UZS", 860, 2, 2, 0, 1, "Uzbekistani Som", "UZS"),
  row("VED", 926, 2, 2, 2, 1, "Bolívar Soberano", ""),
  row("VES", 928, 2, 2, 2, 1, "Venezuelan Bolívar", "VES"),
  row("VND", 704, 0, 0, 0, 1, "Vietnamese Dong", "₫"),
  row("VUV", 548, 0, 0, 0, 1, "Vanuatu Vatu", "VUV"),
  row("WST", 882, 2, 2, 2, 1, "Samoan Tala", "WST"),
  row("XAD", 396, 2, 2, 2, 1, "Arab Accounting Dinar", ""),
  row("XAF", 950, 0, 0, 0, 1, "Central African CFA Franc", "FCFA"),
  row("XCD", 951, 2, 2, 2, 1, "East Caribbean Dollar", "EC$"),
  row("XCG", 532, 2, 2, 2, 1, "Caribbean guilder", "Cg."),
  row("XOF", 952, 0, 0, 0, 1, "West African CFA Franc", "F CFA"),
  row("XPF", 953, 0, 0, 0, 1, "CFP Franc", "CFPF"),
  row("YER", 886, 2, 0, 0, 1, "Yemeni Rial", "YER"),
  row("ZAR", 710, 2, 2, 2, 1, "South African Rand", "ZAR"),
  row("ZMW", 967, 2, 2, 2, 1, "Zambian Kwacha", "ZMW"),
  row("ZWG", 924, 2, 2, 2, 1, "Zimbabwean Gold", "ZWG"),
]