currency-codes 2.0.0.0 → 3.0.0.0
raw patch · 6 files changed
+679/−1167 lines, 6 filesdep +QuickCheckdep +currency-codesdep +deepseqdep ~aesondep ~basedep ~bson
Dependencies added: QuickCheck, currency-codes, deepseq, hspec
Dependency ranges changed: aeson, base, bson
Files
- .stylish-haskell.yaml +41/−0
- CHANGELOG.md +10/−1
- currency-codes.cabal +55/−16
- src/Data/Currency.hs +518/−1150
- test/Data/CurrencySpec.hs +54/−0
- test/Spec.hs +1/−0
+ .stylish-haskell.yaml view
@@ -0,0 +1,41 @@+---+columns: 100+language_extensions:+ - BangPatterns+ - DefaultSignatures+ - DataKinds+ - DeriveDataTypeable+ - DeriveFunctor+ - DeriveGeneric+ - ExistentialQuantification+ - FlexibleContexts+ - GADTs+ - GeneralizedNewtypeDeriving+ - MultiParamTypeClasses+ - OverloadedStrings+ - RecordWildCards+ - ScopedTypeVariables+ - TupleSections+ - TypeOperators+steps:+ - simple_align:+ cases: true+ top_level_patterns: true+ records: true++ - imports:+ align: global+ list_align: after_alias+ pad_module_names: true+ long_list_align: inline+ empty_list_align: inherit+ list_padding: 4+ separate_lists: true+ space_surround: false++ - language_pragmas:+ style: vertical+ align: true+ remove_redundant: true++ - trailing_whitespace: {}
CHANGELOG.md view
@@ -1,8 +1,17 @@ # Changelog +## v3.0.0.0 (2018-03-13)++- Review Currency strictness+- Add deepseq's NFData instance for Currency & Alpha+- Manually write Show & Read instance for Alpha (compile-time & performance gain)+- Remove currency constructors in favor of helper `fromAlpha` +- Add property tests to verify various instances ++ ## v2.0.0.0 (2017-09-11) -Remove Swagger instances. It would be better to push them upstream to the swagger2 repository.+- Remove Swagger instances. It would be better to push them upstream to the swagger2 repository. ## v1.0.0.0 (2017-08-29)
currency-codes.cabal view
@@ -1,11 +1,11 @@ name: currency-codes-version: 2.0.0.0+version: 3.0.0.0 synopsis: ISO-4217 Currency Codes description: ISO-4217 Currency Codes license: MIT license-file: LICENSE author: Chordify-maintainer: Matthias Benkort <matthias@chordify.net>+maintainer: Matthias Benkort <matthias.benkort@gmail.com> copyright: (c) 2017 Chordify category: Data build-type: Simple@@ -15,30 +15,69 @@ CHANGELOG.md stack.yaml Setup.hs+ .stylish-haskell.yaml cabal-version: >=1.10 library hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall- default-extensions: DataKinds- , DeriveDataTypeable- , DeriveFunctor- , DeriveGeneric- , ExistentialQuantification- , FlexibleContexts- , GADTs- , GeneralizedNewtypeDeriving- , MultiParamTypeClasses- , OverloadedStrings- , RecordWildCards- , ScopedTypeVariables- , TupleSections- , TypeOperators+ default-extensions: BangPatterns+ , DefaultSignatures+ , DataKinds+ , DeriveDataTypeable+ , DeriveFunctor+ , DeriveGeneric+ , ExistentialQuantification+ , FlexibleContexts+ , GADTs+ , GeneralizedNewtypeDeriving+ , MultiParamTypeClasses+ , OverloadedStrings+ , RecordWildCards+ , ScopedTypeVariables+ , TupleSections+ , TypeOperators+ build-depends: base >= 4 && < 5 , aeson >= 0.7.0.0 , bson >= 0.2.0+ , deepseq , random >= 1.0.0.0 , safe >= 0.2 , text >= 1.0.0.0+ exposed-modules: Data.Currency+++test-suite currency-codes-test+ hs-source-dirs: test+ main-is: Spec.hs+ type: exitcode-stdio-1.0+ default-language: Haskell2010+ ghc-options: -Wall+ default-extensions: BangPatterns+ , DefaultSignatures+ , DataKinds+ , DeriveDataTypeable+ , DeriveFunctor+ , DeriveGeneric+ , ExistentialQuantification+ , FlexibleContexts+ , GADTs+ , GeneralizedNewtypeDeriving+ , MultiParamTypeClasses+ , OverloadedStrings+ , RecordWildCards+ , ScopedTypeVariables+ , TupleSections+ , TypeOperators++ build-depends: base+ , currency-codes+ , QuickCheck+ , aeson+ , bson+ , hspec++ other-modules: Data.CurrencySpec
src/Data/Currency.hs view
@@ -1,1152 +1,520 @@ -- | A Currency representation as specified in the ISO-4217 standard -module Data.Currency where--import Prelude hiding (Ordering (..))--import Control.Monad ((>=>))-import Data.Aeson as Aeson-import Data.Aeson (FromJSON (..), ToJSON (..))-import Data.Bson (Val (..), (=:))-import qualified Data.Bson as Bson-import Data.Data (Data)-import Data.Text (Text)-import Data.Typeable (Typeable)-import GHC.Generics (Generic)-import qualified Safe-import System.Random (Random (..))----- | Actual representation of a currency-data Currency = Currency- { alpha :: Alpha -- ^ Alpha Code- , numeric :: Int -- ^ Numeric code- , minor :: Int -- ^ Number of decimal units- , name :: Text -- ^ English name- } deriving (Show, Eq, Read, Generic, Data, Typeable)--instance FromJSON Currency where parseJSON = Aeson.genericParseJSON Aeson.defaultOptions--instance ToJSON Currency where toJSON = Aeson.genericToJSON Aeson.defaultOptions--instance Val Currency where- val Currency{..} = Bson.Doc- [ "alpha" =: alpha- , "numeric" =: numeric- , "minor" =: minor- , "name" =: name- ]-- cast' v = case v of- Bson.Doc doc -> Currency- <$> Bson.lookup "alpha" doc- <*> Bson.lookup "numeric" doc- <*> Bson.lookup "minor" doc- <*> Bson.lookup "name" doc-- _ -> Nothing--instance Random Currency where- random g =- let (i, g') = randomR (0, length currencies - 1) g- in (currencies !! i, g')-- randomR (a, b) g =- let currencies' = dropWhile (/= a) $ takeWhile (/= b) currencies- (i, g') = randomR (0, length currencies' - 1) g- in (currencies' !! i, g')---- | A type which represents ISO 4217 alphabetic codes as an enum-data Alpha- = AED -- ^ UAE Dirham- | AFN -- ^ Afghani- | ALL -- ^ Lek- | AMD -- ^ Armenian Dram- | ANG -- ^ Netherlands Antillean Guilder- | AOA -- ^ Kwanza- | ARS -- ^ Argentine Peso- | AUD -- ^ Australian Dollar- | AWG -- ^ Aruban Florin- | AZN -- ^ Azerbaijan Manat- | BAM -- ^ Convertible Mark- | BBD -- ^ Barbados Dollar- | BDT -- ^ Taka- | BGN -- ^ Bulgarian Lev- | BHD -- ^ Bahraini Dinar- | BIF -- ^ Burundi Franc- | BMD -- ^ Bermudian Dollar- | BND -- ^ Brunei Dollar- | BOB -- ^ Boliviano- | BOV -- ^ Mvdol- | BRL -- ^ Brazilian Real- | BSD -- ^ Bahamian Dollar- | BTN -- ^ Ngultrum- | BWP -- ^ Pula- | BYN -- ^ Belarusian Ruble- | BZD -- ^ Belize Dollar- | CAD -- ^ Canadian Dollar- | CDF -- ^ Congolese Franc- | CHE -- ^ WIR Euro- | CHF -- ^ Swiss Franc- | CHW -- ^ WIR Franc- | CLF -- ^ Unidad de Fomento- | CLP -- ^ Chilean Peso- | CNY -- ^ Yuan Renminbi- | COP -- ^ Colombian Peso- | COU -- ^ Unidad de Valor Real- | CRC -- ^ Costa Rican Colon- | CUC -- ^ Peso Convertible- | CUP -- ^ Cuban Peso- | CVE -- ^ Cabo Verde Escudo- | CZK -- ^ Czech Koruna- | DJF -- ^ Djibouti Franc- | DKK -- ^ Danish Krone- | DOP -- ^ Dominican Peso- | DZD -- ^ Algerian Dinar- | EGP -- ^ Egyptian Pound- | ERN -- ^ Nakfa- | ETB -- ^ Ethiopian Birr- | EUR -- ^ Euro- | FJD -- ^ Fiji Dollar- | FKP -- ^ Falkland Islands Pound- | GBP -- ^ Pound Sterling- | GEL -- ^ Lari- | GHS -- ^ Ghana Cedi- | GIP -- ^ Gibraltar Pound- | GMD -- ^ Dalasi- | GNF -- ^ Guinean Franc- | GTQ -- ^ Quetzal- | GYD -- ^ Guyana Dollar- | HKD -- ^ Hong Kong Dollar- | HNL -- ^ Lempira- | HRK -- ^ Kuna- | HTG -- ^ Gourde- | HUF -- ^ Forint- | IDR -- ^ Rupiah- | ILS -- ^ New Israeli Sheqel- | INR -- ^ Indian Rupee- | IQD -- ^ Iraqi Dinar- | IRR -- ^ Iranian Rial- | ISK -- ^ Iceland Krona- | JMD -- ^ Jamaican Dollar- | JOD -- ^ Jordanian Dinar- | JPY -- ^ Yen- | KES -- ^ Kenyan Shilling- | KGS -- ^ Som- | KHR -- ^ Riel- | KMF -- ^ Comorian Franc- | KPW -- ^ North Korean Won- | KRW -- ^ Won- | KWD -- ^ Kuwaiti Dinar- | KYD -- ^ Cayman Islands Dollar- | KZT -- ^ Tenge- | LAK -- ^ Lao Kip- | LBP -- ^ Lebanese Pound- | LKR -- ^ Sri Lanka Rupee- | LRD -- ^ Liberian Dollar- | LSL -- ^ Loti- | LYD -- ^ Libyan Dinar- | MAD -- ^ Moroccan Dirham- | MDL -- ^ Moldovan Leu- | MGA -- ^ Malagasy Ariary- | MKD -- ^ Denar- | MMK -- ^ Kyat- | MNT -- ^ Tugrik- | MOP -- ^ Pataca- | MRO -- ^ Ouguiya- | MUR -- ^ Mauritius Rupee- | MVR -- ^ Rufiyaa- | MWK -- ^ Malawi Kwacha- | MXN -- ^ Mexican Peso- | MXV -- ^ Mexican Unidad de Inversion (UDI)- | MYR -- ^ Malaysian Ringgit- | MZN -- ^ Mozambique Metical- | NAD -- ^ Namibia Dollar- | NGN -- ^ Naira- | NIO -- ^ Cordoba Oro- | NOK -- ^ Norwegian Krone- | NPR -- ^ Nepalese Rupee- | NZD -- ^ New Zealand Dollar- | OMR -- ^ Rial Omani- | PAB -- ^ Balboa- | PEN -- ^ Sol- | PGK -- ^ Kina- | PHP -- ^ Philippine Peso- | PKR -- ^ Pakistan Rupee- | PLN -- ^ Zloty- | PYG -- ^ Guarani- | QAR -- ^ Qatari Rial- | RON -- ^ Romanian Leu- | RSD -- ^ Serbian Dinar- | RUB -- ^ Russian Ruble- | RWF -- ^ Rwanda Franc- | SAR -- ^ Saudi Riyal- | SBD -- ^ Solomon Islands Dollar- | SCR -- ^ Seychelles Rupee- | SDG -- ^ Sudanese Pound- | SEK -- ^ Swedish Krona- | SGD -- ^ Singapore Dollar- | SHP -- ^ Saint Helena Pound- | SLL -- ^ Leone- | SOS -- ^ Somali Shilling- | SRD -- ^ Surinam Dollar- | SSP -- ^ South Sudanese Pound- | STD -- ^ Dobra- | SVC -- ^ El Salvador Colon- | SYP -- ^ Syrian Pound- | SZL -- ^ Lilangeni- | THB -- ^ Baht- | TJS -- ^ Somoni- | TMT -- ^ Turkmenistan New Manat- | TND -- ^ Tunisian Dinar- | TOP -- ^ Pa’anga- | TRY -- ^ Turkish Lira- | TTD -- ^ Trinidad and Tobago Dollar- | TWD -- ^ New Taiwan Dollar- | TZS -- ^ Tanzanian Shilling- | UAH -- ^ Hryvnia- | UGX -- ^ Uganda Shilling- | USD -- ^ US Dollar- | USN -- ^ US Dollar (Next day)- | UYI -- ^ Uruguay Peso en Unidades Indexadas (URUIURUI)- | UYU -- ^ Peso Uruguayo- | UZS -- ^ Uzbekistan Sum- | VEF -- ^ Bolívar- | VND -- ^ Dong- | VUV -- ^ Vatu- | WST -- ^ Tala- | XAF -- ^ CFA Franc BEAC- | XAG -- ^ Silver- | XAU -- ^ Gold- | XBA -- ^ Bond Markets Unit European Composite Unit (EURCO)- | XBB -- ^ Bond Markets Unit European Monetary Unit (E.M.U.-6)- | XBC -- ^ Bond Markets Unit European Unit of Account 9 (E.U.A.-9)- | XBD -- ^ Bond Markets Unit European Unit of Account 17 (E.U.A.-17)- | XCD -- ^ East Caribbean Dollar- | XDR -- ^ SDR (Special Drawing Right)- | XOF -- ^ CFA Franc BCEAO- | XPD -- ^ Palladium- | XPF -- ^ CFP Franc- | XPT -- ^ Platinum- | XSU -- ^ Sucre- | XTS -- ^ Codes specifically reserved for testing purposes- | XUA -- ^ ADB Unit of Account- | XXX -- ^ The codes assigned for transactions where no currency is involved- | YER -- ^ Yemeni Rial- | ZAR -- ^ Rand- | ZMW -- ^ Zambian Kwacha- | ZWL -- ^ Zimbabwe Dollar- deriving (Show, Eq, Ord, Enum, Bounded, Read, Generic, Data, Typeable)--instance FromJSON Alpha where parseJSON = Aeson.genericParseJSON Aeson.defaultOptions--instance ToJSON Alpha where toJSON = Aeson.genericToJSON Aeson.defaultOptions--instance Val Alpha where val = val . show- cast' = cast' >=> Safe.readMay--instance Random Alpha where- random g =- let (r, g') = randomR (fromEnum (minBound :: Alpha), fromEnum(maxBound :: Alpha)) g- in (toEnum r, g')-- randomR (l, h) g =- let (r, g') = randomR (fromEnum l, fromEnum h) g- in (toEnum r, g')---- Constructor for all currencies--unitOfAccount :: Currency-unitOfAccount =- Currency XUA 965 0 "ADB Unit of Account"--afghani :: Currency-afghani =- Currency AFN 971 2 "Afghani"--algerianDinar :: Currency-algerianDinar =- Currency DZD 012 2 "Algerian Dinar"--argentinePeso :: Currency-argentinePeso =- Currency ARS 032 2 "Argentine Peso"--armenianDram :: Currency-armenianDram =- Currency AMD 051 2 "Armenian Dram"--arubanFlorin :: Currency-arubanFlorin =- Currency AWG 533 2 "Aruban Florin"--australianDollar :: Currency-australianDollar =- Currency AUD 036 2 "Australian Dollar"--azerbaijanManat :: Currency-azerbaijanManat =- Currency AZN 944 2 "Azerbaijan Manat"--bahamianDollar :: Currency-bahamianDollar =- Currency BSD 044 2 "Bahamian Dollar"--bahrainiDinar :: Currency-bahrainiDinar =- Currency BHD 048 3 "Bahraini Dinar"--baht :: Currency-baht =- Currency THB 764 2 "Baht"--balboa :: Currency-balboa =- Currency PAB 590 2 "Balboa"--barbadosDollar :: Currency-barbadosDollar =- Currency BBD 052 2 "Barbados Dollar"--belarusianRuble :: Currency-belarusianRuble =- Currency BYN 933 2 "Belarusian Ruble"--belizeDollar :: Currency-belizeDollar =- Currency BZD 084 2 "Belize Dollar"--bermudianDollar :: Currency-bermudianDollar =- Currency BMD 060 2 "Bermudian Dollar"--boliviano :: Currency-boliviano =- Currency BOB 068 2 "Boliviano"--bolívar :: Currency-bolívar =- Currency VEF 937 2 "Bolívar"--bondMarketsCompositeUnit :: Currency-bondMarketsCompositeUnit =- Currency XBA 955 0 "Bond Markets Unit European Composite Unit (EURCO)"--bondMarketsMonetaryUnit :: Currency-bondMarketsMonetaryUnit =- Currency XBB 956 0 "Bond Markets Unit European Monetary Unit (E.M.U.-6)"--bondMarketsUnitofAccount17 :: Currency-bondMarketsUnitofAccount17 =- Currency XBD 958 0 "Bond Markets Unit European Unit of Account 17 (E.U.A.-17)"--bondMarketsUnitofAccount9 :: Currency-bondMarketsUnitofAccount9 =- Currency XBC 957 0 "Bond Markets Unit European Unit of Account 9 (E.U.A.-9)"--brazilianReal :: Currency-brazilianReal =- Currency BRL 986 2 "Brazilian Real"--bruneiDollar :: Currency-bruneiDollar =- Currency BND 096 2 "Brunei Dollar"--bulgarianLev :: Currency-bulgarianLev =- Currency BGN 975 2 "Bulgarian Lev"--burundiFranc :: Currency-burundiFranc =- Currency BIF 108 0 "Burundi Franc"--cfaFrancBCEAO :: Currency-cfaFrancBCEAO =- Currency XOF 952 0 "CFA Franc BCEAO"--cfaFrancBEAC :: Currency-cfaFrancBEAC =- Currency XAF 950 0 "CFA Franc BEAC"--cfpFranc :: Currency-cfpFranc =- Currency XPF 953 0 "CFP Franc"--caboVerdeEscudo :: Currency-caboVerdeEscudo =- Currency CVE 132 2 "Cabo Verde Escudo"--canadianDollar :: Currency-canadianDollar =- Currency CAD 124 2 "Canadian Dollar"--caymanIslandsDollar :: Currency-caymanIslandsDollar =- Currency KYD 136 2 "Cayman Islands Dollar"--chileanPeso :: Currency-chileanPeso =- Currency CLP 152 0 "Chilean Peso"--testing :: Currency-testing =- Currency XTS 963 0 "Codes specifically reserved for testing purposes"--colombianPeso :: Currency-colombianPeso =- Currency COP 170 2 "Colombian Peso"--comorianFranc :: Currency-comorianFranc =- Currency KMF 174 0 "Comorian Franc"--congoleseFranc :: Currency-congoleseFranc =- Currency CDF 976 2 "Congolese Franc"--convertibleMark :: Currency-convertibleMark =- Currency BAM 977 2 "Convertible Mark"--cordobaOro :: Currency-cordobaOro =- Currency NIO 558 2 "Cordoba Oro"--costaRicanColon :: Currency-costaRicanColon =- Currency CRC 188 2 "Costa Rican Colon"--cubanPeso :: Currency-cubanPeso =- Currency CUP 192 2 "Cuban Peso"--czechKoruna :: Currency-czechKoruna =- Currency CZK 203 2 "Czech Koruna"--dalasi :: Currency-dalasi =- Currency GMD 270 2 "Dalasi"--danishKrone :: Currency-danishKrone =- Currency DKK 208 2 "Danish Krone"--denar :: Currency-denar =- Currency MKD 807 2 "Denar"--djiboutiFranc :: Currency-djiboutiFranc =- Currency DJF 262 0 "Djibouti Franc"--dobra :: Currency-dobra =- Currency STD 678 2 "Dobra"--dominicanPeso :: Currency-dominicanPeso =- Currency DOP 214 2 "Dominican Peso"--dong :: Currency-dong =- Currency VND 704 0 "Dong"--eastCaribbeanDollar :: Currency-eastCaribbeanDollar =- Currency XCD 951 2 "East Caribbean Dollar"--egyptianPound :: Currency-egyptianPound =- Currency EGP 818 2 "Egyptian Pound"--elSalvadorColon :: Currency-elSalvadorColon =- Currency SVC 222 2 "El Salvador Colon"--ethiopianBirr :: Currency-ethiopianBirr =- Currency ETB 230 2 "Ethiopian Birr"--euro :: Currency-euro =- Currency EUR 978 2 "Euro"--falklandIslandsPound :: Currency-falklandIslandsPound =- Currency FKP 238 2 "Falkland Islands Pound"--fijiDollar :: Currency-fijiDollar =- Currency FJD 242 2 "Fiji Dollar"--forint :: Currency-forint =- Currency HUF 348 2 "Forint"--ghanaCedi :: Currency-ghanaCedi =- Currency GHS 936 2 "Ghana Cedi"--gibraltarPound :: Currency-gibraltarPound =- Currency GIP 292 2 "Gibraltar Pound"--gold :: Currency-gold =- Currency XAU 959 0 "Gold"--gourde :: Currency-gourde =- Currency HTG 332 2 "Gourde"--guarani :: Currency-guarani =- Currency PYG 600 0 "Guarani"--guineanFranc :: Currency-guineanFranc =- Currency GNF 324 0 "Guinean Franc"--guyanaDollar :: Currency-guyanaDollar =- Currency GYD 328 2 "Guyana Dollar"--hongKongDollar :: Currency-hongKongDollar =- Currency HKD 344 2 "Hong Kong Dollar"--hryvnia :: Currency-hryvnia =- Currency UAH 980 2 "Hryvnia"--icelandKrona :: Currency-icelandKrona =- Currency ISK 352 0 "Iceland Krona"--indianRupee :: Currency-indianRupee =- Currency INR 356 2 "Indian Rupee"--iranianRial :: Currency-iranianRial =- Currency IRR 364 2 "Iranian Rial"--iraqiDinar :: Currency-iraqiDinar =- Currency IQD 368 3 "Iraqi Dinar"--jamaicanDollar :: Currency-jamaicanDollar =- Currency JMD 388 2 "Jamaican Dollar"--jordanianDinar :: Currency-jordanianDinar =- Currency JOD 400 3 "Jordanian Dinar"--kenyanShilling :: Currency-kenyanShilling =- Currency KES 404 2 "Kenyan Shilling"--kina :: Currency-kina =- Currency PGK 598 2 "Kina"--kuna :: Currency-kuna =- Currency HRK 191 2 "Kuna"--kuwaitiDinar :: Currency-kuwaitiDinar =- Currency KWD 414 3 "Kuwaiti Dinar"--kwanza :: Currency-kwanza =- Currency AOA 973 2 "Kwanza"--kyat :: Currency-kyat =- Currency MMK 104 2 "Kyat"--laoKip :: Currency-laoKip =- Currency LAK 418 2 "Lao Kip"--lari :: Currency-lari =- Currency GEL 981 2 "Lari"--lebanesePound :: Currency-lebanesePound =- Currency LBP 422 2 "Lebanese Pound"--lek :: Currency-lek =- Currency ALL 008 2 "Lek"--lempira :: Currency-lempira =- Currency HNL 340 2 "Lempira"--leone :: Currency-leone =- Currency SLL 694 2 "Leone"--liberianDollar :: Currency-liberianDollar =- Currency LRD 430 2 "Liberian Dollar"--libyanDinar :: Currency-libyanDinar =- Currency LYD 434 3 "Libyan Dinar"--lilangeni :: Currency-lilangeni =- Currency SZL 748 2 "Lilangeni"--loti :: Currency-loti =- Currency LSL 426 2 "Loti"--malagasyAriary :: Currency-malagasyAriary =- Currency MGA 969 2 "Malagasy Ariary"--malawiKwacha :: Currency-malawiKwacha =- Currency MWK 454 2 "Malawi Kwacha"--malaysianRinggit :: Currency-malaysianRinggit =- Currency MYR 458 2 "Malaysian Ringgit"--mauritiusRupee :: Currency-mauritiusRupee =- Currency MUR 480 2 "Mauritius Rupee"--mexicanPeso :: Currency-mexicanPeso =- Currency MXN 484 2 "Mexican Peso"--mexicanUnidadDeInversion :: Currency-mexicanUnidadDeInversion =- Currency MXV 979 2 "Mexican Unidad de Inversion (UDI)"--moldovanLeu :: Currency-moldovanLeu =- Currency MDL 498 2 "Moldovan Leu"--moroccanDirham :: Currency-moroccanDirham =- Currency MAD 504 2 "Moroccan Dirham"--mozambiqueMetical :: Currency-mozambiqueMetical =- Currency MZN 943 2 "Mozambique Metical"--mvdol :: Currency-mvdol =- Currency BOV 984 2 "Mvdol"--naira :: Currency-naira =- Currency NGN 566 2 "Naira"--nakfa :: Currency-nakfa =- Currency ERN 232 2 "Nakfa"--namibiaDollar :: Currency-namibiaDollar =- Currency NAD 516 2 "Namibia Dollar"--nepaleseRupee :: Currency-nepaleseRupee =- Currency NPR 524 2 "Nepalese Rupee"--netherlandsAntilleanGuilder :: Currency-netherlandsAntilleanGuilder =- Currency ANG 532 2 "Netherlands Antillean Guilder"--newIsraeliSheqel :: Currency-newIsraeliSheqel =- Currency ILS 376 2 "New Israeli Sheqel"--newTaiwanDollar :: Currency-newTaiwanDollar =- Currency TWD 901 2 "New Taiwan Dollar"--newZealandDollar :: Currency-newZealandDollar =- Currency NZD 554 2 "New Zealand Dollar"--ngultrum :: Currency-ngultrum =- Currency BTN 064 2 "Ngultrum"--northKoreanWon :: Currency-northKoreanWon =- Currency KPW 408 2 "North Korean Won"--norwegianKrone :: Currency-norwegianKrone =- Currency NOK 578 2 "Norwegian Krone"--ouguiya :: Currency-ouguiya =- Currency MRO 478 2 "Ouguiya"--pakistanRupee :: Currency-pakistanRupee =- Currency PKR 586 2 "Pakistan Rupee"--palladium :: Currency-palladium =- Currency XPD 964 0 "Palladium"--pataca :: Currency-pataca =- Currency MOP 446 2 "Pataca"--paanga :: Currency-paanga =- Currency TOP 776 2 "Pa’anga"--pesoConvertible :: Currency-pesoConvertible =- Currency CUC 931 2 "Peso Convertible"--pesoUruguayo :: Currency-pesoUruguayo =- Currency UYU 858 2 "Peso Uruguayo"--philippinePeso :: Currency-philippinePeso =- Currency PHP 608 2 "Philippine Peso"--platinum :: Currency-platinum =- Currency XPT 962 0 "Platinum"--poundSterling :: Currency-poundSterling =- Currency GBP 826 2 "Pound Sterling"--pula :: Currency-pula =- Currency BWP 072 2 "Pula"--qatariRial :: Currency-qatariRial =- Currency QAR 634 2 "Qatari Rial"--quetzal :: Currency-quetzal =- Currency GTQ 320 2 "Quetzal"--rand :: Currency-rand =- Currency ZAR 710 2 "Rand"--rialOmani :: Currency-rialOmani =- Currency OMR 512 3 "Rial Omani"--riel :: Currency-riel =- Currency KHR 116 2 "Riel"--romanianLeu :: Currency-romanianLeu =- Currency RON 946 2 "Romanian Leu"--rufiyaa :: Currency-rufiyaa =- Currency MVR 462 2 "Rufiyaa"--rupiah :: Currency-rupiah =- Currency IDR 360 2 "Rupiah"--russianRuble :: Currency-russianRuble =- Currency RUB 643 2 "Russian Ruble"--rwandaFranc :: Currency-rwandaFranc =- Currency RWF 646 0 "Rwanda Franc"--sdr :: Currency-sdr =- Currency XDR 960 0 "SDR (Special Drawing Right)"--saintHelenaPound :: Currency-saintHelenaPound =- Currency SHP 654 2 "Saint-Helena Pound"--saudiRiyal :: Currency-saudiRiyal =- Currency SAR 682 2 "Saudi Riyal"--serbianDinar :: Currency-serbianDinar =- Currency RSD 941 2 "Serbian Dinar"--seychellesRupee :: Currency-seychellesRupee =- Currency SCR 690 2 "Seychelles Rupee"--silver :: Currency-silver =- Currency XAG 961 0 "Silver"--singaporeDollar :: Currency-singaporeDollar =- Currency SGD 702 2 "Singapore Dollar"--sol :: Currency-sol =- Currency PEN 604 2 "Sol"--solomonIslandsDollar :: Currency-solomonIslandsDollar =- Currency SBD 090 2 "Solomon Islands Dollar"--som :: Currency-som =- Currency KGS 417 2 "Som"--somaliShilling :: Currency-somaliShilling =- Currency SOS 706 2 "Somali Shilling"--somoni :: Currency-somoni =- Currency TJS 972 2 "Somoni"--southSudanesePound :: Currency-southSudanesePound =- Currency SSP 728 2 "South Sudanese Pound"--sriLankaRupee :: Currency-sriLankaRupee =- Currency LKR 144 2 "Sri Lanka Rupee"--sucre :: Currency-sucre =- Currency XSU 994 0 "Sucre"--sudanesePound :: Currency-sudanesePound =- Currency SDG 938 2 "Sudanese Pound"--surinamDollar :: Currency-surinamDollar =- Currency SRD 968 2 "Surinam Dollar"--swedishKrona :: Currency-swedishKrona =- Currency SEK 752 2 "Swedish Krona"--swissFranc :: Currency-swissFranc =- Currency CHF 756 2 "Swiss Franc"--syrianPound :: Currency-syrianPound =- Currency SYP 760 2 "Syrian Pound"--taka :: Currency-taka =- Currency BDT 050 2 "Taka"--tala :: Currency-tala =- Currency WST 882 2 "Tala"--tanzanianShilling :: Currency-tanzanianShilling =- Currency TZS 834 2 "Tanzanian Shilling"--tenge :: Currency-tenge =- Currency KZT 398 2 "Tenge"--noCurrency :: Currency-noCurrency =- Currency XXX 999 0 "The codes assigned for transactions where no currency is involved"--trinidadAndTobagoDollar :: Currency-trinidadAndTobagoDollar =- Currency TTD 780 2 "Trinidad and Tobago Dollar"--tugrik :: Currency-tugrik =- Currency MNT 496 2 "Tugrik"--tunisianDinar :: Currency-tunisianDinar =- Currency TND 788 3 "Tunisian Dinar"--turkishLira :: Currency-turkishLira =- Currency TRY 949 2 "Turkish Lira"--turkmenistanNewManat :: Currency-turkmenistanNewManat =- Currency TMT 934 2 "Turkmenistan New Manat"--uAEDirham :: Currency-uAEDirham =- Currency AED 784 2 "UAE Dirham"--usDollar :: Currency-usDollar =- Currency USD 840 2 "US Dollar"--usDollarNextday :: Currency-usDollarNextday =- Currency USN 997 2 "US Dollar (Next day)"--ugandaShilling :: Currency-ugandaShilling =- Currency UGX 800 0 "Uganda"--unidaddeFomento :: Currency-unidaddeFomento =- Currency CLF 990 4 "Unidad de Fomento"--unidaddeValorReal :: Currency-unidaddeValorReal =- Currency COU 970 2 "Unidad de Valor Real"--uruguayPesoEnUnidadesIndexadas :: Currency-uruguayPesoEnUnidadesIndexadas =- Currency UYI 940 0 "Uruguay Peso en Unidades Indexadas (URUIURUI)"--uzbekistanSum :: Currency-uzbekistanSum =- Currency UZS 860 2 "Uzbekistan"--vatu :: Currency-vatu =- Currency VUV 548 0 "Vatu"--wirEuro :: Currency-wirEuro =- Currency CHE 947 2 "WIR Euro"--wirFranc :: Currency-wirFranc =- Currency CHW 948 2 "WIR Franc"--won :: Currency-won =- Currency KRW 410 0 "Won"--yemeniRial :: Currency-yemeniRial =- Currency YER 886 2 "Yemeni Rial"--yen :: Currency-yen =- Currency JPY 392 0 "Yen"--yuanRenminbi :: Currency-yuanRenminbi =- Currency CNY 156 2 "Yuan Renminbi"--zambianKwacha :: Currency-zambianKwacha =- Currency ZMW 967 2 "Zambian Kwacha"--zimbabweDollar :: Currency-zimbabweDollar =- Currency ZWL 932 2 "Zimbabwe Dollar"--zloty :: Currency-zloty =- Currency PLN 985 2 "Zloty"---- | List of all currencies in the standard-currencies :: [Currency]-currencies =- [ unitOfAccount- , afghani- , algerianDinar- , argentinePeso- , armenianDram- , arubanFlorin- , australianDollar- , azerbaijanManat- , bahamianDollar- , bahrainiDinar- , baht- , balboa- , barbadosDollar- , belarusianRuble- , belizeDollar- , bermudianDollar- , boliviano- , bolívar- , bondMarketsCompositeUnit- , bondMarketsMonetaryUnit- , bondMarketsUnitofAccount17- , bondMarketsUnitofAccount9- , brazilianReal- , bruneiDollar- , bulgarianLev- , burundiFranc- , cfaFrancBCEAO- , cfaFrancBEAC- , cfpFranc- , caboVerdeEscudo- , canadianDollar- , caymanIslandsDollar- , chileanPeso- , testing- , colombianPeso- , comorianFranc- , congoleseFranc- , convertibleMark- , cordobaOro- , costaRicanColon- , cubanPeso- , czechKoruna- , dalasi- , danishKrone- , denar- , djiboutiFranc- , dobra- , dominicanPeso- , dong- , eastCaribbeanDollar- , egyptianPound- , elSalvadorColon- , ethiopianBirr- , euro- , falklandIslandsPound- , fijiDollar- , forint- , ghanaCedi- , gibraltarPound- , gold- , gourde- , guarani- , guineanFranc- , guyanaDollar- , hongKongDollar- , hryvnia- , icelandKrona- , indianRupee- , iranianRial- , iraqiDinar- , jamaicanDollar- , jordanianDinar- , kenyanShilling- , kina- , kuna- , kuwaitiDinar- , kwanza- , kyat- , laoKip- , lari- , lebanesePound- , lek- , lempira- , leone- , liberianDollar- , libyanDinar- , lilangeni- , loti- , malagasyAriary- , malawiKwacha- , malaysianRinggit- , mauritiusRupee- , mexicanPeso- , mexicanUnidadDeInversion- , moldovanLeu- , moroccanDirham- , mozambiqueMetical- , mvdol- , naira- , nakfa- , namibiaDollar- , nepaleseRupee- , netherlandsAntilleanGuilder- , newIsraeliSheqel- , newTaiwanDollar- , newZealandDollar- , ngultrum- , northKoreanWon- , norwegianKrone- , ouguiya- , pakistanRupee- , palladium- , pataca- , paanga- , pesoConvertible- , pesoUruguayo- , philippinePeso- , platinum- , poundSterling- , pula- , qatariRial- , quetzal- , rand- , rialOmani- , riel- , romanianLeu- , rufiyaa- , rupiah- , russianRuble- , rwandaFranc- , sdr- , saintHelenaPound- , saudiRiyal- , serbianDinar- , seychellesRupee- , silver- , singaporeDollar- , sol- , solomonIslandsDollar- , som- , somaliShilling- , somoni- , southSudanesePound- , sriLankaRupee- , sucre- , sudanesePound- , surinamDollar- , swedishKrona- , swissFranc- , syrianPound- , taka- , tala- , tanzanianShilling- , tenge- , noCurrency- , trinidadAndTobagoDollar- , tugrik- , tunisianDinar- , turkishLira- , turkmenistanNewManat- , uAEDirham- , usDollar- , usDollarNextday- , ugandaShilling- , unidaddeFomento- , unidaddeValorReal- , uruguayPesoEnUnidadesIndexadas- , uzbekistanSum- , vatu- , wirEuro- , wirFranc- , won- , yemeniRial- , yen- , yuanRenminbi- , zambianKwacha- , zloty- , zimbabweDollar- ]+module Data.Currency+ -- * Types+ ( Currency(..)+ , Alpha(..)+ , currencies++ -- * Create utilities+ , fromAlpha+ ) where++import Prelude hiding (Ordering (..))++import Control.DeepSeq (NFData)+import Control.Monad ((>=>))+import Data.Aeson (FromJSON (..), ToJSON (..))+import Data.Bson (Val (..), (=:))+import Data.Data (Data, dataTypeConstrs, dataTypeOf, toConstr)+import Data.List (elemIndex)+import Data.Text (Text)+import Data.Typeable (Typeable)+import GHC.Generics (Generic)+import System.Random (Random (..))++import qualified Data.Aeson as Aeson+import qualified Data.Bson as Bson+import qualified Safe+++-- | Actual representation of a currency+data Currency = Currency+ { alpha :: !Alpha -- ^ Alpha Code+ , numeric :: !Int -- ^ Numeric code+ , minor :: !Int -- ^ Number of decimal units+ , name :: !Text -- ^ English name+ } deriving (Show, Eq, Read, Generic, Data, Typeable)+++instance NFData Currency+++instance FromJSON Currency where+ parseJSON =+ Aeson.genericParseJSON Aeson.defaultOptions+++instance ToJSON Currency where+ toJSON =+ Aeson.genericToJSON Aeson.defaultOptions+++instance Val Currency where+ val Currency{..} = Bson.Doc+ [ "alpha" =: alpha+ , "numeric" =: numeric+ , "minor" =: minor+ , "name" =: name+ ]++ cast' = cast' >=> \doc -> Currency+ <$> Bson.lookup "alpha" doc+ <*> Bson.lookup "numeric" doc+ <*> Bson.lookup "minor" doc+ <*> Bson.lookup "name" doc+++instance Random Currency where+ random g =+ let+ (i, g') =+ randomR (0, length currencies - 1) g+ in+ (currencies !! i, g')++ randomR (a, b) g =+ let+ currencies' =+ dropWhile (/= a) $ takeWhile (/= b) currencies++ (i, g') =+ randomR (0, length currencies' - 1) g+ in+ (currencies' !! i, g')+++-- | A type which represents ISO 4217 alphabetic codes as an enum+data Alpha+ = AED -- ^ UAE Dirham+ | AFN -- ^ Afghani+ | ALL -- ^ Lek+ | AMD -- ^ Armenian Dram+ | ANG -- ^ Netherlands Antillean Guilder+ | AOA -- ^ Kwanza+ | ARS -- ^ Argentine Peso+ | AUD -- ^ Australian Dollar+ | AWG -- ^ Aruban Florin+ | AZN -- ^ Azerbaijan Manat+ | BAM -- ^ Convertible Mark+ | BBD -- ^ Barbados Dollar+ | BDT -- ^ Taka+ | BGN -- ^ Bulgarian Lev+ | BHD -- ^ Bahraini Dinar+ | BIF -- ^ Burundi Franc+ | BMD -- ^ Bermudian Dollar+ | BND -- ^ Brunei Dollar+ | BOB -- ^ Boliviano+ | BOV -- ^ Mvdol+ | BRL -- ^ Brazilian Real+ | BSD -- ^ Bahamian Dollar+ | BTN -- ^ Ngultrum+ | BWP -- ^ Pula+ | BYN -- ^ Belarusian Ruble+ | BZD -- ^ Belize Dollar+ | CAD -- ^ Canadian Dollar+ | CDF -- ^ Congolese Franc+ | CHE -- ^ WIR Euro+ | CHF -- ^ Swiss Franc+ | CHW -- ^ WIR Franc+ | CLF -- ^ Unidad de Fomento+ | CLP -- ^ Chilean Peso+ | CNY -- ^ Yuan Renminbi+ | COP -- ^ Colombian Peso+ | COU -- ^ Unidad de Valor Real+ | CRC -- ^ Costa Rican Colon+ | CUC -- ^ Peso Convertible+ | CUP -- ^ Cuban Peso+ | CVE -- ^ Cabo Verde Escudo+ | CZK -- ^ Czech Koruna+ | DJF -- ^ Djibouti Franc+ | DKK -- ^ Danish Krone+ | DOP -- ^ Dominican Peso+ | DZD -- ^ Algerian Dinar+ | EGP -- ^ Egyptian Pound+ | ERN -- ^ Nakfa+ | ETB -- ^ Ethiopian Birr+ | EUR -- ^ Euro+ | FJD -- ^ Fiji Dollar+ | FKP -- ^ Falkland Islands Pound+ | GBP -- ^ Pound Sterling+ | GEL -- ^ Lari+ | GHS -- ^ Ghana Cedi+ | GIP -- ^ Gibraltar Pound+ | GMD -- ^ Dalasi+ | GNF -- ^ Guinean Franc+ | GTQ -- ^ Quetzal+ | GYD -- ^ Guyana Dollar+ | HKD -- ^ Hong Kong Dollar+ | HNL -- ^ Lempira+ | HRK -- ^ Kuna+ | HTG -- ^ Gourde+ | HUF -- ^ Forint+ | IDR -- ^ Rupiah+ | ILS -- ^ New Israeli Sheqel+ | INR -- ^ Indian Rupee+ | IQD -- ^ Iraqi Dinar+ | IRR -- ^ Iranian Rial+ | ISK -- ^ Iceland Krona+ | JMD -- ^ Jamaican Dollar+ | JOD -- ^ Jordanian Dinar+ | JPY -- ^ Yen+ | KES -- ^ Kenyan Shilling+ | KGS -- ^ Som+ | KHR -- ^ Riel+ | KMF -- ^ Comorian Franc+ | KPW -- ^ North Korean Won+ | KRW -- ^ Won+ | KWD -- ^ Kuwaiti Dinar+ | KYD -- ^ Cayman Islands Dollar+ | KZT -- ^ Tenge+ | LAK -- ^ Lao Kip+ | LBP -- ^ Lebanese Pound+ | LKR -- ^ Sri Lanka Rupee+ | LRD -- ^ Liberian Dollar+ | LSL -- ^ Loti+ | LYD -- ^ Libyan Dinar+ | MAD -- ^ Moroccan Dirham+ | MDL -- ^ Moldovan Leu+ | MGA -- ^ Malagasy Ariary+ | MKD -- ^ Denar+ | MMK -- ^ Kyat+ | MNT -- ^ Tugrik+ | MOP -- ^ Pataca+ | MRO -- ^ Ouguiya+ | MUR -- ^ Mauritius Rupee+ | MVR -- ^ Rufiyaa+ | MWK -- ^ Malawi Kwacha+ | MXN -- ^ Mexican Peso+ | MXV -- ^ Mexican Unidad de Inversion (UDI)+ | MYR -- ^ Malaysian Ringgit+ | MZN -- ^ Mozambique Metical+ | NAD -- ^ Namibia Dollar+ | NGN -- ^ Naira+ | NIO -- ^ Cordoba Oro+ | NOK -- ^ Norwegian Krone+ | NPR -- ^ Nepalese Rupee+ | NZD -- ^ New Zealand Dollar+ | OMR -- ^ Rial Omani+ | PAB -- ^ Balboa+ | PEN -- ^ Sol+ | PGK -- ^ Kina+ | PHP -- ^ Philippine Peso+ | PKR -- ^ Pakistan Rupee+ | PLN -- ^ Zloty+ | PYG -- ^ Guarani+ | QAR -- ^ Qatari Rial+ | RON -- ^ Romanian Leu+ | RSD -- ^ Serbian Dinar+ | RUB -- ^ Russian Ruble+ | RWF -- ^ Rwanda Franc+ | SAR -- ^ Saudi Riyal+ | SBD -- ^ Solomon Islands Dollar+ | SCR -- ^ Seychelles Rupee+ | SDG -- ^ Sudanese Pound+ | SEK -- ^ Swedish Krona+ | SGD -- ^ Singapore Dollar+ | SHP -- ^ Saint Helena Pound+ | SLL -- ^ Leone+ | SOS -- ^ Somali Shilling+ | SRD -- ^ Surinam Dollar+ | SSP -- ^ South Sudanese Pound+ | STD -- ^ Dobra+ | SVC -- ^ El Salvador Colon+ | SYP -- ^ Syrian Pound+ | SZL -- ^ Lilangeni+ | THB -- ^ Baht+ | TJS -- ^ Somoni+ | TMT -- ^ Turkmenistan New Manat+ | TND -- ^ Tunisian Dinar+ | TOP -- ^ Pa’anga+ | TRY -- ^ Turkish Lira+ | TTD -- ^ Trinidad and Tobago Dollar+ | TWD -- ^ New Taiwan Dollar+ | TZS -- ^ Tanzanian Shilling+ | UAH -- ^ Hryvnia+ | UGX -- ^ Uganda Shilling+ | USD -- ^ US Dollar+ | USN -- ^ US Dollar (Next day)+ | UYI -- ^ Uruguay Peso en Unidades Indexadas (URUIURUI)+ | UYU -- ^ Peso Uruguayo+ | UZS -- ^ Uzbekistan Sum+ | VEF -- ^ Bolívar+ | VND -- ^ Dong+ | VUV -- ^ Vatu+ | WST -- ^ Tala+ | XAF -- ^ CFA Franc BEAC+ | XAG -- ^ Silver+ | XAU -- ^ Gold+ | XBA -- ^ Bond Markets Unit European Composite Unit (EURCO)+ | XBB -- ^ Bond Markets Unit European Monetary Unit (E.M.U.-6)+ | XBC -- ^ Bond Markets Unit European Unit of Account 9 (E.U.A.-9)+ | XBD -- ^ Bond Markets Unit European Unit of Account 17 (E.U.A.-17)+ | XCD -- ^ East Caribbean Dollar+ | XDR -- ^ SDR (Special Drawing Right)+ | XOF -- ^ CFA Franc BCEAO+ | XPD -- ^ Palladium+ | XPF -- ^ CFP Franc+ | XPT -- ^ Platinum+ | XSU -- ^ Sucre+ | XTS -- ^ Codes specifically reserved for testing purposes+ | XUA -- ^ ADB Unit of Account+ | XXX -- ^ The codes assigned for transactions where no currency is involved+ | YER -- ^ Yemeni Rial+ | ZAR -- ^ Rand+ | ZMW -- ^ Zambian Kwacha+ | ZWL -- ^ Zimbabwe Dollar+ deriving (Eq, Ord, Enum, Bounded, Generic, Data, Typeable)+++instance NFData Alpha+++instance Show Alpha where+ show =+ show . toConstr+++instance Read Alpha where+ readsPrec _ str =+ let+ (α, rest) = splitAt 3 (dropWhile (== ' ') str)+ in+ case elemIndex α alphas of+ Just i ->+ [(toEnum i, rest)]++ Nothing ->+ []+++instance FromJSON Alpha where+ parseJSON =+ Aeson.genericParseJSON Aeson.defaultOptions+++instance ToJSON Alpha where+ toJSON =+ Aeson.genericToJSON Aeson.defaultOptions+++instance Val Alpha where+ val =+ val . show++ cast' =+ cast' >=> Safe.readMay+++instance Random Alpha where+ random g =+ let+ (r, g') =+ randomR (fromEnum (minBound :: Alpha), fromEnum(maxBound :: Alpha)) g+ in+ (toEnum r, g')++ randomR (l, h) g =+ let+ (r, g') =+ randomR (fromEnum l, fromEnum h) g+ in+ (toEnum r, g')+++-- Create utilities++-- | Obtain a Currency from its Alpha code+fromAlpha :: Alpha -> Currency+fromAlpha α =+ case α of+ AED -> Currency AED 784 2 "UAE Dirham"+ AFN -> Currency AFN 971 2 "Afghani"+ ALL -> Currency ALL 008 2 "Lek"+ AMD -> Currency AMD 051 2 "Armenian Dram"+ ANG -> Currency ANG 532 2 "Netherlands Antillean Guilder"+ AOA -> Currency AOA 973 2 "Kwanza"+ ARS -> Currency ARS 032 2 "Argentine Peso"+ AUD -> Currency AUD 036 2 "Australian Dollar"+ AWG -> Currency AWG 533 2 "Aruban Florin"+ AZN -> Currency AZN 944 2 "Azerbaijan Manat"+ BAM -> Currency BAM 977 2 "Convertible Mark"+ BBD -> Currency BBD 052 2 "Barbados Dollar"+ BDT -> Currency BDT 050 2 "Taka"+ BGN -> Currency BGN 975 2 "Bulgarian Lev"+ BHD -> Currency BHD 048 3 "Bahraini Dinar"+ BIF -> Currency BIF 108 0 "Burundi Franc"+ BMD -> Currency BMD 060 2 "Bermudian Dollar"+ BND -> Currency BND 096 2 "Brunei Dollar"+ BOB -> Currency BOB 068 2 "Boliviano"+ BOV -> Currency BOV 984 2 "Mvdol"+ BRL -> Currency BRL 986 2 "Brazilian Real"+ BSD -> Currency BSD 044 2 "Bahamian Dollar"+ BTN -> Currency BTN 064 2 "Ngultrum"+ BWP -> Currency BWP 072 2 "Pula"+ BYN -> Currency BYN 933 2 "Belarusian Ruble"+ BZD -> Currency BZD 084 2 "Belize Dollar"+ CAD -> Currency CAD 124 2 "Canadian Dollar"+ CDF -> Currency CDF 976 2 "Congolese Franc"+ CHE -> Currency CHE 947 2 "WIR Euro"+ CHF -> Currency CHF 756 2 "Swiss Franc"+ CHW -> Currency CHW 948 2 "WIR Franc"+ CLF -> Currency CLF 990 4 "Unidad de Fomento"+ CLP -> Currency CLP 152 0 "Chilean Peso"+ CNY -> Currency CNY 156 2 "Yuan Renminbi"+ COP -> Currency COP 170 2 "Colombian Peso"+ COU -> Currency COU 970 2 "Unidad de Valor Real"+ CRC -> Currency CRC 188 2 "Costa Rican Colon"+ CUC -> Currency CUC 931 2 "Peso Convertible"+ CUP -> Currency CUP 192 2 "Cuban Peso"+ CVE -> Currency CVE 132 2 "Cabo Verde Escudo"+ CZK -> Currency CZK 203 2 "Czech Koruna"+ DJF -> Currency DJF 262 0 "Djibouti Franc"+ DKK -> Currency DKK 208 2 "Danish Krone"+ DOP -> Currency DOP 214 2 "Dominican Peso"+ DZD -> Currency DZD 012 2 "Algerian Dinar"+ EGP -> Currency EGP 818 2 "Egyptian Pound"+ ERN -> Currency ERN 232 2 "Nakfa"+ ETB -> Currency ETB 230 2 "Ethiopian Birr"+ EUR -> Currency EUR 978 2 "Euro"+ FJD -> Currency FJD 242 2 "Fiji Dollar"+ FKP -> Currency FKP 238 2 "Falkland Islands Pound"+ GBP -> Currency GBP 826 2 "Pound Sterling"+ GEL -> Currency GEL 981 2 "Lari"+ GHS -> Currency GHS 936 2 "Ghana Cedi"+ GIP -> Currency GIP 292 2 "Gibraltar Pound"+ GMD -> Currency GMD 270 2 "Dalasi"+ GNF -> Currency GNF 324 0 "Guinean Franc"+ GTQ -> Currency GTQ 320 2 "Quetzal"+ GYD -> Currency GYD 328 2 "Guyana Dollar"+ HKD -> Currency HKD 344 2 "Hong Kong Dollar"+ HNL -> Currency HNL 340 2 "Lempira"+ HRK -> Currency HRK 191 2 "Kuna"+ HTG -> Currency HTG 332 2 "Gourde"+ HUF -> Currency HUF 348 2 "Forint"+ IDR -> Currency IDR 360 2 "Rupiah"+ ILS -> Currency ILS 376 2 "New Israeli Sheqel"+ INR -> Currency INR 356 2 "Indian Rupee"+ IQD -> Currency IQD 368 3 "Iraqi Dinar"+ IRR -> Currency IRR 364 2 "Iranian Rial"+ ISK -> Currency ISK 352 0 "Iceland Krona"+ JMD -> Currency JMD 388 2 "Jamaican Dollar"+ JOD -> Currency JOD 400 3 "Jordanian Dinar"+ JPY -> Currency JPY 392 0 "Yen"+ KES -> Currency KES 404 2 "Kenyan Shilling"+ KGS -> Currency KGS 417 2 "Som"+ KHR -> Currency KHR 116 2 "Riel"+ KMF -> Currency KMF 174 0 "Comorian Franc"+ KPW -> Currency KPW 408 2 "North Korean Won"+ KRW -> Currency KRW 410 0 "Won"+ KWD -> Currency KWD 414 3 "Kuwaiti Dinar"+ KYD -> Currency KYD 136 2 "Cayman Islands Dollar"+ KZT -> Currency KZT 398 2 "Tenge"+ LAK -> Currency LAK 418 2 "Lao Kip"+ LBP -> Currency LBP 422 2 "Lebanese Pound"+ LKR -> Currency LKR 144 2 "Sri Lanka Rupee"+ LRD -> Currency LRD 430 2 "Liberian Dollar"+ LSL -> Currency LSL 426 2 "Loti"+ LYD -> Currency LYD 434 3 "Libyan Dinar"+ MAD -> Currency MAD 504 2 "Moroccan Dirham"+ MDL -> Currency MDL 498 2 "Moldovan Leu"+ MGA -> Currency MGA 969 2 "Malagasy Ariary"+ MKD -> Currency MKD 807 2 "Denar"+ MMK -> Currency MMK 104 2 "Kyat"+ MNT -> Currency MNT 496 2 "Tugrik"+ MOP -> Currency MOP 446 2 "Pataca"+ MRO -> Currency MRO 478 2 "Ouguiya"+ MUR -> Currency MUR 480 2 "Mauritius Rupee"+ MVR -> Currency MVR 462 2 "Rufiyaa"+ MWK -> Currency MWK 454 2 "Malawi Kwacha"+ MXN -> Currency MXN 484 2 "Mexican Peso"+ MXV -> Currency MXV 979 2 "Mexican Unidad de Inversion (UDI)"+ MYR -> Currency MYR 458 2 "Malaysian Ringgit"+ MZN -> Currency MZN 943 2 "Mozambique Metical"+ NAD -> Currency NAD 516 2 "Namibia Dollar"+ NGN -> Currency NGN 566 2 "Naira"+ NIO -> Currency NIO 558 2 "Cordoba Oro"+ NOK -> Currency NOK 578 2 "Norwegian Krone"+ NPR -> Currency NPR 524 2 "Nepalese Rupee"+ NZD -> Currency NZD 554 2 "New Zealand Dollar"+ OMR -> Currency OMR 512 3 "Rial Omani"+ PAB -> Currency PAB 590 2 "Balboa"+ PEN -> Currency PEN 604 2 "Sol"+ PGK -> Currency PGK 598 2 "Kina"+ PHP -> Currency PHP 608 2 "Philippine Peso"+ PKR -> Currency PKR 586 2 "Pakistan Rupee"+ PLN -> Currency PLN 985 2 "Zloty"+ PYG -> Currency PYG 600 0 "Guarani"+ QAR -> Currency QAR 634 2 "Qatari Rial"+ RON -> Currency RON 946 2 "Romanian Leu"+ RSD -> Currency RSD 941 2 "Serbian Dinar"+ RUB -> Currency RUB 643 2 "Russian Ruble"+ RWF -> Currency RWF 646 0 "Rwanda Franc"+ SAR -> Currency SAR 682 2 "Saudi Riyal"+ SBD -> Currency SBD 090 2 "Solomon Islands Dollar"+ SCR -> Currency SCR 690 2 "Seychelles Rupee"+ SDG -> Currency SDG 938 2 "Sudanese Pound"+ SEK -> Currency SEK 752 2 "Swedish Krona"+ SGD -> Currency SGD 702 2 "Singapore Dollar"+ SHP -> Currency SHP 654 2 "Saint-Helena Pound"+ SLL -> Currency SLL 694 2 "Leone"+ SOS -> Currency SOS 706 2 "Somali Shilling"+ SRD -> Currency SRD 968 2 "Surinam Dollar"+ SSP -> Currency SSP 728 2 "South Sudanese Pound"+ STD -> Currency STD 678 2 "Dobra"+ SVC -> Currency SVC 222 2 "El Salvador Colon"+ SYP -> Currency SYP 760 2 "Syrian Pound"+ SZL -> Currency SZL 748 2 "Lilangeni"+ THB -> Currency THB 764 2 "Baht"+ TJS -> Currency TJS 972 2 "Somoni"+ TMT -> Currency TMT 934 2 "Turkmenistan New Manat"+ TND -> Currency TND 788 3 "Tunisian Dinar"+ TOP -> Currency TOP 776 2 "Pa’anga"+ TRY -> Currency TRY 949 2 "Turkish Lira"+ TTD -> Currency TTD 780 2 "Trinidad and Tobago Dollar"+ TWD -> Currency TWD 901 2 "New Taiwan Dollar"+ TZS -> Currency TZS 834 2 "Tanzanian Shilling"+ UAH -> Currency UAH 980 2 "Hryvnia"+ UGX -> Currency UGX 800 0 "Uganda"+ USD -> Currency USD 840 2 "US Dollar"+ USN -> Currency USN 997 2 "US Dollar (Next day)"+ UYI -> Currency UYI 940 0 "Uruguay Peso en Unidades Indexadas (URUIURUI)"+ UYU -> Currency UYU 858 2 "Peso Uruguayo"+ UZS -> Currency UZS 860 2 "Uzbekistan"+ VEF -> Currency VEF 937 2 "Bolívar"+ VND -> Currency VND 704 0 "Dong"+ VUV -> Currency VUV 548 0 "Vatu"+ WST -> Currency WST 882 2 "Tala"+ XAF -> Currency XAF 950 0 "CFA Franc BEAC"+ XAG -> Currency XAG 961 0 "Silver"+ XAU -> Currency XAU 959 0 "Gold"+ XBA -> Currency XBA 955 0 "Bond Markets Unit European Composite Unit (EURCO)"+ XBB -> Currency XBB 956 0 "Bond Markets Unit European Monetary Unit (E.M.U.-6)"+ XBC -> Currency XBC 957 0 "Bond Markets Unit European Unit of Account 9 (E.U.A.-9)"+ XBD -> Currency XBD 958 0 "Bond Markets Unit European Unit of Account 17 (E.U.A.-17)"+ XCD -> Currency XCD 951 2 "East Caribbean Dollar"+ XDR -> Currency XDR 960 0 "SDR (Special Drawing Right)"+ XOF -> Currency XOF 952 0 "CFA Franc BCEAO"+ XPD -> Currency XPD 964 0 "Palladium"+ XPF -> Currency XPF 953 0 "CFP Franc"+ XPT -> Currency XPT 962 0 "Platinum"+ XSU -> Currency XSU 994 0 "Sucre"+ XTS -> Currency XTS 963 0 "Codes specifically reserved for testing purposes"+ XUA -> Currency XUA 965 0 "ADB Unit of Account"+ XXX -> Currency XXX 999 0 "The codes assigned for transactions where no currency is involved"+ YER -> Currency YER 886 2 "Yemeni Rial"+ ZAR -> Currency ZAR 710 2 "Rand"+ ZMW -> Currency ZMW 967 2 "Zambian Kwacha"+ ZWL -> Currency ZWL 932 2 "Zimbabwe Dollar"+++-- | List of all currencies in the standard+currencies :: [Currency]+currencies =+ fmap fromAlpha [minBound..maxBound]+++-- | List of all alpha constructors as strings+alphas :: [String]+alphas =+ fmap show $ dataTypeConstrs $ dataTypeOf (minBound :: Alpha)
+ test/Data/CurrencySpec.hs view
@@ -0,0 +1,54 @@+-- | Specifications for the Data.Currency module+{-# OPTIONS_GHC -fno-warn-orphans #-}++module Data.CurrencySpec+ ( spec+ ) where++import Data.Bson (Val (..))+import Test.Hspec (Spec, describe, it)+import Test.QuickCheck (Arbitrary (..), property)+import Test.QuickCheck.Gen (chooseAny)++import qualified Data.Aeson as Aeson++import Data.Currency (Alpha, Currency (..), fromAlpha)+++instance Arbitrary Currency where+ arbitrary =+ chooseAny+++instance Arbitrary Alpha where+ arbitrary =+ chooseAny+++spec :: Spec+spec = do+ describe "Round-up properties (Currency)" $ do+ it "Read . Show = id" $ property $+ \x -> (read . show) x == (x :: Currency)++ it "FromJSON . ToJSON = pure" $ property $+ \x -> (Aeson.eitherDecode . Aeson.encode) x == pure (x :: Currency)++ it "cast' . val === pure" $ property $+ \x -> (cast' . val) x == pure (x :: Currency)+++ describe "Round-up properties (Alpha)" $ do+ it "Read . Show = id" $ property $+ \x -> (read . show) x == (x :: Alpha)++ it "FromJSON . ToJSON = pure" $ property $+ \x -> (Aeson.eitherDecode . Aeson.encode) x == pure (x :: Alpha)++ it "cast' . val === pure" $ property $+ \x -> (cast' . val) x == pure (x :: Alpha)+++ describe "fromAlpha" $+ it "alpha . fromAlpha = id" $ property $+ \x -> (alpha . fromAlpha) x == x
+ test/Spec.hs view
@@ -0,0 +1,1 @@+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}