-- | A Currency representation as specified in the ISO-4217 standard

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
  { Currency -> Alpha
alpha   :: !Alpha -- ^ Alpha Code
  , Currency -> Int
numeric :: !Int   -- ^ Numeric code
  , Currency -> Int
minor   :: !Int   -- ^ Number of decimal units
  , Currency -> Text
name    :: !Text  -- ^ English name
  } deriving (Int -> Currency -> ShowS
[Currency] -> ShowS
Currency -> String
(Int -> Currency -> ShowS)
-> (Currency -> String) -> ([Currency] -> ShowS) -> Show Currency
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Currency -> ShowS
showsPrec :: Int -> Currency -> ShowS
$cshow :: Currency -> String
show :: Currency -> String
$cshowList :: [Currency] -> ShowS
showList :: [Currency] -> ShowS
Show, Currency -> Currency -> Bool
(Currency -> Currency -> Bool)
-> (Currency -> Currency -> Bool) -> Eq Currency
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Currency -> Currency -> Bool
== :: Currency -> Currency -> Bool
$c/= :: Currency -> Currency -> Bool
/= :: Currency -> Currency -> Bool
Eq, ReadPrec [Currency]
ReadPrec Currency
Int -> ReadS Currency
ReadS [Currency]
(Int -> ReadS Currency)
-> ReadS [Currency]
-> ReadPrec Currency
-> ReadPrec [Currency]
-> Read Currency
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Currency
readsPrec :: Int -> ReadS Currency
$creadList :: ReadS [Currency]
readList :: ReadS [Currency]
$creadPrec :: ReadPrec Currency
readPrec :: ReadPrec Currency
$creadListPrec :: ReadPrec [Currency]
readListPrec :: ReadPrec [Currency]
Read, (forall x. Currency -> Rep Currency x)
-> (forall x. Rep Currency x -> Currency) -> Generic Currency
forall x. Rep Currency x -> Currency
forall x. Currency -> Rep Currency x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Currency -> Rep Currency x
from :: forall x. Currency -> Rep Currency x
$cto :: forall x. Rep Currency x -> Currency
to :: forall x. Rep Currency x -> Currency
Generic, Typeable Currency
Typeable Currency =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> Currency -> c Currency)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Currency)
-> (Currency -> Constr)
-> (Currency -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Currency))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Currency))
-> ((forall b. Data b => b -> b) -> Currency -> Currency)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Currency -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Currency -> r)
-> (forall u. (forall d. Data d => d -> u) -> Currency -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Currency -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Currency -> m Currency)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Currency -> m Currency)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Currency -> m Currency)
-> Data Currency
Currency -> Constr
Currency -> DataType
(forall b. Data b => b -> b) -> Currency -> Currency
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Currency -> u
forall u. (forall d. Data d => d -> u) -> Currency -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Currency -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Currency -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Currency
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Currency -> c Currency
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Currency)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Currency)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Currency -> c Currency
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Currency -> c Currency
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Currency
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Currency
$ctoConstr :: Currency -> Constr
toConstr :: Currency -> Constr
$cdataTypeOf :: Currency -> DataType
dataTypeOf :: Currency -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Currency)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Currency)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Currency)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Currency)
$cgmapT :: (forall b. Data b => b -> b) -> Currency -> Currency
gmapT :: (forall b. Data b => b -> b) -> Currency -> Currency
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Currency -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Currency -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Currency -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Currency -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Currency -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> Currency -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Currency -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Currency -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Currency -> m Currency
Data, Typeable)


instance NFData Currency


instance FromJSON Currency where
  parseJSON :: Value -> Parser Currency
parseJSON =
    Options -> Value -> Parser Currency
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
Aeson.defaultOptions


instance ToJSON Currency where
  toJSON :: Currency -> Value
toJSON =
    Options -> Currency -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
Aeson.defaultOptions


instance Val Currency where
  val :: Currency -> Value
val Currency{Int
Text
Alpha
alpha :: Currency -> Alpha
numeric :: Currency -> Int
minor :: Currency -> Int
name :: Currency -> Text
alpha :: Alpha
numeric :: Int
minor :: Int
name :: Text
..} = Document -> Value
Bson.Doc
    [ Text
"alpha"   Text -> Alpha -> Field
forall v. Val v => Text -> v -> Field
=: Alpha
alpha
    , Text
"numeric" Text -> Int -> Field
forall v. Val v => Text -> v -> Field
=: Int
numeric
    , Text
"minor"   Text -> Int -> Field
forall v. Val v => Text -> v -> Field
=: Int
minor
    , Text
"name"    Text -> Text -> Field
forall v. Val v => Text -> v -> Field
=: Text
name
    ]

  cast' :: Value -> Maybe Currency
cast' = Value -> Maybe Document
forall a. Val a => Value -> Maybe a
cast' (Value -> Maybe Document)
-> (Document -> Maybe Currency) -> Value -> Maybe Currency
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> \Document
doc -> Alpha -> Int -> Int -> Text -> Currency
Currency
    (Alpha -> Int -> Int -> Text -> Currency)
-> Maybe Alpha -> Maybe (Int -> Int -> Text -> Currency)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Document -> Maybe Alpha
forall v (m :: * -> *).
(Val v, MonadFail m) =>
Text -> Document -> m v
Bson.lookup Text
"alpha"   Document
doc
    Maybe (Int -> Int -> Text -> Currency)
-> Maybe Int -> Maybe (Int -> Text -> Currency)
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Document -> Maybe Int
forall v (m :: * -> *).
(Val v, MonadFail m) =>
Text -> Document -> m v
Bson.lookup Text
"numeric" Document
doc
    Maybe (Int -> Text -> Currency)
-> Maybe Int -> Maybe (Text -> Currency)
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Document -> Maybe Int
forall v (m :: * -> *).
(Val v, MonadFail m) =>
Text -> Document -> m v
Bson.lookup Text
"minor"   Document
doc
    Maybe (Text -> Currency) -> Maybe Text -> Maybe Currency
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Document -> Maybe Text
forall v (m :: * -> *).
(Val v, MonadFail m) =>
Text -> Document -> m v
Bson.lookup Text
"name"    Document
doc


instance Random Currency where
  random :: forall g. RandomGen g => g -> (Currency, g)
random g
g =
    let
      (Int
i, g
g') =
        (Int, Int) -> g -> (Int, g)
forall g. RandomGen g => (Int, Int) -> g -> (Int, g)
forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR (Int
0, [Currency] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Currency]
currencies Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) g
g
    in
      ([Currency]
currencies [Currency] -> Int -> Currency
forall a. HasCallStack => [a] -> Int -> a
!! Int
i, g
g')

  randomR :: forall g. RandomGen g => (Currency, Currency) -> g -> (Currency, g)
randomR (Currency
a, Currency
b) g
g =
    let
      currencies' :: [Currency]
currencies' =
        (Currency -> Bool) -> [Currency] -> [Currency]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Currency -> Currency -> Bool
forall a. Eq a => a -> a -> Bool
/= Currency
a) ([Currency] -> [Currency]) -> [Currency] -> [Currency]
forall a b. (a -> b) -> a -> b
$ (Currency -> Bool) -> [Currency] -> [Currency]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Currency -> Currency -> Bool
forall a. Eq a => a -> a -> Bool
/= Currency
b) [Currency]
currencies

      (Int
i, g
g') =
        (Int, Int) -> g -> (Int, g)
forall g. RandomGen g => (Int, Int) -> g -> (Int, g)
forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR (Int
0, [Currency] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Currency]
currencies' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) g
g
    in
      ([Currency]
currencies' [Currency] -> Int -> Currency
forall a. HasCallStack => [a] -> Int -> a
!! Int
i, g
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 (Alpha -> Alpha -> Bool
(Alpha -> Alpha -> Bool) -> (Alpha -> Alpha -> Bool) -> Eq Alpha
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Alpha -> Alpha -> Bool
== :: Alpha -> Alpha -> Bool
$c/= :: Alpha -> Alpha -> Bool
/= :: Alpha -> Alpha -> Bool
Eq, Eq Alpha
Eq Alpha =>
(Alpha -> Alpha -> Ordering)
-> (Alpha -> Alpha -> Bool)
-> (Alpha -> Alpha -> Bool)
-> (Alpha -> Alpha -> Bool)
-> (Alpha -> Alpha -> Bool)
-> (Alpha -> Alpha -> Alpha)
-> (Alpha -> Alpha -> Alpha)
-> Ord Alpha
Alpha -> Alpha -> Bool
Alpha -> Alpha -> Ordering
Alpha -> Alpha -> Alpha
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Alpha -> Alpha -> Ordering
compare :: Alpha -> Alpha -> Ordering
$c< :: Alpha -> Alpha -> Bool
< :: Alpha -> Alpha -> Bool
$c<= :: Alpha -> Alpha -> Bool
<= :: Alpha -> Alpha -> Bool
$c> :: Alpha -> Alpha -> Bool
> :: Alpha -> Alpha -> Bool
$c>= :: Alpha -> Alpha -> Bool
>= :: Alpha -> Alpha -> Bool
$cmax :: Alpha -> Alpha -> Alpha
max :: Alpha -> Alpha -> Alpha
$cmin :: Alpha -> Alpha -> Alpha
min :: Alpha -> Alpha -> Alpha
Ord, Int -> Alpha
Alpha -> Int
Alpha -> [Alpha]
Alpha -> Alpha
Alpha -> Alpha -> [Alpha]
Alpha -> Alpha -> Alpha -> [Alpha]
(Alpha -> Alpha)
-> (Alpha -> Alpha)
-> (Int -> Alpha)
-> (Alpha -> Int)
-> (Alpha -> [Alpha])
-> (Alpha -> Alpha -> [Alpha])
-> (Alpha -> Alpha -> [Alpha])
-> (Alpha -> Alpha -> Alpha -> [Alpha])
-> Enum Alpha
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Alpha -> Alpha
succ :: Alpha -> Alpha
$cpred :: Alpha -> Alpha
pred :: Alpha -> Alpha
$ctoEnum :: Int -> Alpha
toEnum :: Int -> Alpha
$cfromEnum :: Alpha -> Int
fromEnum :: Alpha -> Int
$cenumFrom :: Alpha -> [Alpha]
enumFrom :: Alpha -> [Alpha]
$cenumFromThen :: Alpha -> Alpha -> [Alpha]
enumFromThen :: Alpha -> Alpha -> [Alpha]
$cenumFromTo :: Alpha -> Alpha -> [Alpha]
enumFromTo :: Alpha -> Alpha -> [Alpha]
$cenumFromThenTo :: Alpha -> Alpha -> Alpha -> [Alpha]
enumFromThenTo :: Alpha -> Alpha -> Alpha -> [Alpha]
Enum, Alpha
Alpha -> Alpha -> Bounded Alpha
forall a. a -> a -> Bounded a
$cminBound :: Alpha
minBound :: Alpha
$cmaxBound :: Alpha
maxBound :: Alpha
Bounded, (forall x. Alpha -> Rep Alpha x)
-> (forall x. Rep Alpha x -> Alpha) -> Generic Alpha
forall x. Rep Alpha x -> Alpha
forall x. Alpha -> Rep Alpha x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Alpha -> Rep Alpha x
from :: forall x. Alpha -> Rep Alpha x
$cto :: forall x. Rep Alpha x -> Alpha
to :: forall x. Rep Alpha x -> Alpha
Generic, Typeable Alpha
Typeable Alpha =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> Alpha -> c Alpha)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Alpha)
-> (Alpha -> Constr)
-> (Alpha -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Alpha))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Alpha))
-> ((forall b. Data b => b -> b) -> Alpha -> Alpha)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r)
-> (forall u. (forall d. Data d => d -> u) -> Alpha -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Alpha -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Alpha -> m Alpha)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Alpha -> m Alpha)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Alpha -> m Alpha)
-> Data Alpha
Alpha -> Constr
Alpha -> DataType
(forall b. Data b => b -> b) -> Alpha -> Alpha
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Alpha -> u
forall u. (forall d. Data d => d -> u) -> Alpha -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Alpha
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Alpha -> c Alpha
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Alpha)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Alpha)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Alpha -> c Alpha
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Alpha -> c Alpha
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Alpha
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Alpha
$ctoConstr :: Alpha -> Constr
toConstr :: Alpha -> Constr
$cdataTypeOf :: Alpha -> DataType
dataTypeOf :: Alpha -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Alpha)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Alpha)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Alpha)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Alpha)
$cgmapT :: (forall b. Data b => b -> b) -> Alpha -> Alpha
gmapT :: (forall b. Data b => b -> b) -> Alpha -> Alpha
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Alpha -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Alpha -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> Alpha -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Alpha -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Alpha -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Alpha -> m Alpha
Data, Typeable)


instance NFData Alpha


instance Show Alpha where
  show :: Alpha -> String
show =
    Constr -> String
forall a. Show a => a -> String
show (Constr -> String) -> (Alpha -> Constr) -> Alpha -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Alpha -> Constr
forall a. Data a => a -> Constr
toConstr


instance Read Alpha where
  readsPrec :: Int -> ReadS Alpha
readsPrec Int
_ String
str =
    let
      (String
α, String
rest) = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
3 ((Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
' ') String
str)
    in
      case String -> [String] -> Maybe Int
forall a. Eq a => a -> [a] -> Maybe Int
elemIndex String
α [String]
alphas of
        Just Int
i ->
          [(Int -> Alpha
forall a. Enum a => Int -> a
toEnum Int
i, String
rest)]

        Maybe Int
Nothing ->
          []


instance FromJSON Alpha where
  parseJSON :: Value -> Parser Alpha
parseJSON =
    Options -> Value -> Parser Alpha
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
Aeson.defaultOptions


instance ToJSON Alpha where
  toJSON :: Alpha -> Value
toJSON =
    Options -> Alpha -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
Aeson.defaultOptions


instance Val Alpha where
  val :: Alpha -> Value
val =
    String -> Value
forall a. Val a => a -> Value
val (String -> Value) -> (Alpha -> String) -> Alpha -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Alpha -> String
forall a. Show a => a -> String
show

  cast' :: Value -> Maybe Alpha
cast' =
    Value -> Maybe String
forall a. Val a => Value -> Maybe a
cast' (Value -> Maybe String)
-> (String -> Maybe Alpha) -> Value -> Maybe Alpha
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> String -> Maybe Alpha
forall a. Read a => String -> Maybe a
Safe.readMay


instance Random Alpha where
  random :: forall g. RandomGen g => g -> (Alpha, g)
random g
g =
    let
      (Int
r, g
g') =
        (Int, Int) -> g -> (Int, g)
forall g. RandomGen g => (Int, Int) -> g -> (Int, g)
forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR (Alpha -> Int
forall a. Enum a => a -> Int
fromEnum (Alpha
forall a. Bounded a => a
minBound :: Alpha), Alpha -> Int
forall a. Enum a => a -> Int
fromEnum(Alpha
forall a. Bounded a => a
maxBound :: Alpha)) g
g
    in
      (Int -> Alpha
forall a. Enum a => Int -> a
toEnum Int
r, g
g')

  randomR :: forall g. RandomGen g => (Alpha, Alpha) -> g -> (Alpha, g)
randomR (Alpha
l, Alpha
h) g
g =
    let
      (Int
r, g
g') =
        (Int, Int) -> g -> (Int, g)
forall g. RandomGen g => (Int, Int) -> g -> (Int, g)
forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR (Alpha -> Int
forall a. Enum a => a -> Int
fromEnum Alpha
l, Alpha -> Int
forall a. Enum a => a -> Int
fromEnum Alpha
h) g
g
    in
      (Int -> Alpha
forall a. Enum a => Int -> a
toEnum Int
r, g
g')


-- Create utilities

-- | Obtain a Currency from its Alpha code
fromAlpha :: Alpha -> Currency
fromAlpha :: Alpha -> Currency
fromAlpha Alpha
α =
  case Alpha
α of
    Alpha
AED -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
AED Int
784 Int
2 Text
"UAE Dirham"
    Alpha
AFN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
AFN Int
971 Int
2 Text
"Afghani"
    Alpha
ALL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ALL Int
008 Int
2 Text
"Lek"
    Alpha
AMD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
AMD Int
051 Int
2 Text
"Armenian Dram"
    Alpha
ANG -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ANG Int
532 Int
2 Text
"Netherlands Antillean Guilder"
    Alpha
AOA -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
AOA Int
973 Int
2 Text
"Kwanza"
    Alpha
ARS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ARS Int
032 Int
2 Text
"Argentine Peso"
    Alpha
AUD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
AUD Int
036 Int
2 Text
"Australian Dollar"
    Alpha
AWG -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
AWG Int
533 Int
2 Text
"Aruban Florin"
    Alpha
AZN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
AZN Int
944 Int
2 Text
"Azerbaijan Manat"
    Alpha
BAM -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BAM Int
977 Int
2 Text
"Convertible Mark"
    Alpha
BBD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BBD Int
052 Int
2 Text
"Barbados Dollar"
    Alpha
BDT -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BDT Int
050 Int
2 Text
"Taka"
    Alpha
BGN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BGN Int
975 Int
2 Text
"Bulgarian Lev"
    Alpha
BHD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BHD Int
048 Int
3 Text
"Bahraini Dinar"
    Alpha
BIF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BIF Int
108 Int
0 Text
"Burundi Franc"
    Alpha
BMD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BMD Int
060 Int
2 Text
"Bermudian Dollar"
    Alpha
BND -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BND Int
096 Int
2 Text
"Brunei Dollar"
    Alpha
BOB -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BOB Int
068 Int
2 Text
"Boliviano"
    Alpha
BOV -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BOV Int
984 Int
2 Text
"Mvdol"
    Alpha
BRL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BRL Int
986 Int
2 Text
"Brazilian Real"
    Alpha
BSD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BSD Int
044 Int
2 Text
"Bahamian Dollar"
    Alpha
BTN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BTN Int
064 Int
2 Text
"Ngultrum"
    Alpha
BWP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BWP Int
072 Int
2 Text
"Pula"
    Alpha
BYN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BYN Int
933 Int
2 Text
"Belarusian Ruble"
    Alpha
BZD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
BZD Int
084 Int
2 Text
"Belize Dollar"
    Alpha
CAD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CAD Int
124 Int
2 Text
"Canadian Dollar"
    Alpha
CDF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CDF Int
976 Int
2 Text
"Congolese Franc"
    Alpha
CHE -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CHE Int
947 Int
2 Text
"WIR Euro"
    Alpha
CHF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CHF Int
756 Int
2 Text
"Swiss Franc"
    Alpha
CHW -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CHW Int
948 Int
2 Text
"WIR Franc"
    Alpha
CLF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CLF Int
990 Int
4 Text
"Unidad de Fomento"
    Alpha
CLP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CLP Int
152 Int
0 Text
"Chilean Peso"
    Alpha
CNY -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CNY Int
156 Int
2 Text
"Yuan Renminbi"
    Alpha
COP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
COP Int
170 Int
2 Text
"Colombian Peso"
    Alpha
COU -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
COU Int
970 Int
2 Text
"Unidad de Valor Real"
    Alpha
CRC -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CRC Int
188 Int
2 Text
"Costa Rican Colon"
    Alpha
CUC -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CUC Int
931 Int
2 Text
"Peso Convertible"
    Alpha
CUP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CUP Int
192 Int
2 Text
"Cuban Peso"
    Alpha
CVE -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CVE Int
132 Int
2 Text
"Cabo Verde Escudo"
    Alpha
CZK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
CZK Int
203 Int
2 Text
"Czech Koruna"
    Alpha
DJF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
DJF Int
262 Int
0 Text
"Djibouti Franc"
    Alpha
DKK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
DKK Int
208 Int
2 Text
"Danish Krone"
    Alpha
DOP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
DOP Int
214 Int
2 Text
"Dominican Peso"
    Alpha
DZD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
DZD Int
012 Int
2 Text
"Algerian Dinar"
    Alpha
EGP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
EGP Int
818 Int
2 Text
"Egyptian Pound"
    Alpha
ERN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ERN Int
232 Int
2 Text
"Nakfa"
    Alpha
ETB -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ETB Int
230 Int
2 Text
"Ethiopian Birr"
    Alpha
EUR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
EUR Int
978 Int
2 Text
"Euro"
    Alpha
FJD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
FJD Int
242 Int
2 Text
"Fiji Dollar"
    Alpha
FKP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
FKP Int
238 Int
2 Text
"Falkland Islands Pound"
    Alpha
GBP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GBP Int
826 Int
2 Text
"Pound Sterling"
    Alpha
GEL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GEL Int
981 Int
2 Text
"Lari"
    Alpha
GHS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GHS Int
936 Int
2 Text
"Ghana Cedi"
    Alpha
GIP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GIP Int
292 Int
2 Text
"Gibraltar Pound"
    Alpha
GMD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GMD Int
270 Int
2 Text
"Dalasi"
    Alpha
GNF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GNF Int
324 Int
0 Text
"Guinean Franc"
    Alpha
GTQ -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GTQ Int
320 Int
2 Text
"Quetzal"
    Alpha
GYD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
GYD Int
328 Int
2 Text
"Guyana Dollar"
    Alpha
HKD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
HKD Int
344 Int
2 Text
"Hong Kong Dollar"
    Alpha
HNL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
HNL Int
340 Int
2 Text
"Lempira"
    Alpha
HRK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
HRK Int
191 Int
2 Text
"Kuna"
    Alpha
HTG -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
HTG Int
332 Int
2 Text
"Gourde"
    Alpha
HUF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
HUF Int
348 Int
2 Text
"Forint"
    Alpha
IDR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
IDR Int
360 Int
2 Text
"Rupiah"
    Alpha
ILS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ILS Int
376 Int
2 Text
"New Israeli Sheqel"
    Alpha
INR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
INR Int
356 Int
2 Text
"Indian Rupee"
    Alpha
IQD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
IQD Int
368 Int
3 Text
"Iraqi Dinar"
    Alpha
IRR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
IRR Int
364 Int
2 Text
"Iranian Rial"
    Alpha
ISK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ISK Int
352 Int
0 Text
"Iceland Krona"
    Alpha
JMD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
JMD Int
388 Int
2 Text
"Jamaican Dollar"
    Alpha
JOD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
JOD Int
400 Int
3 Text
"Jordanian Dinar"
    Alpha
JPY -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
JPY Int
392 Int
0 Text
"Yen"
    Alpha
KES -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KES Int
404 Int
2 Text
"Kenyan Shilling"
    Alpha
KGS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KGS Int
417 Int
2 Text
"Som"
    Alpha
KHR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KHR Int
116 Int
2 Text
"Riel"
    Alpha
KMF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KMF Int
174 Int
0 Text
"Comorian Franc"
    Alpha
KPW -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KPW Int
408 Int
2 Text
"North Korean Won"
    Alpha
KRW -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KRW Int
410 Int
0 Text
"Won"
    Alpha
KWD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KWD Int
414 Int
3 Text
"Kuwaiti Dinar"
    Alpha
KYD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KYD Int
136 Int
2 Text
"Cayman Islands Dollar"
    Alpha
KZT -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
KZT Int
398 Int
2 Text
"Tenge"
    Alpha
LAK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
LAK Int
418 Int
2 Text
"Lao Kip"
    Alpha
LBP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
LBP Int
422 Int
2 Text
"Lebanese Pound"
    Alpha
LKR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
LKR Int
144 Int
2 Text
"Sri Lanka Rupee"
    Alpha
LRD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
LRD Int
430 Int
2 Text
"Liberian Dollar"
    Alpha
LSL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
LSL Int
426 Int
2 Text
"Loti"
    Alpha
LYD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
LYD Int
434 Int
3 Text
"Libyan Dinar"
    Alpha
MAD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MAD Int
504 Int
2 Text
"Moroccan Dirham"
    Alpha
MDL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MDL Int
498 Int
2 Text
"Moldovan Leu"
    Alpha
MGA -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MGA Int
969 Int
2 Text
"Malagasy Ariary"
    Alpha
MKD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MKD Int
807 Int
2 Text
"Denar"
    Alpha
MMK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MMK Int
104 Int
2 Text
"Kyat"
    Alpha
MNT -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MNT Int
496 Int
2 Text
"Tugrik"
    Alpha
MOP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MOP Int
446 Int
2 Text
"Pataca"
    Alpha
MRO -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MRO Int
478 Int
2 Text
"Ouguiya"
    Alpha
MUR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MUR Int
480 Int
2 Text
"Mauritius Rupee"
    Alpha
MVR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MVR Int
462 Int
2 Text
"Rufiyaa"
    Alpha
MWK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MWK Int
454 Int
2 Text
"Malawi Kwacha"
    Alpha
MXN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MXN Int
484 Int
2 Text
"Mexican Peso"
    Alpha
MXV -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MXV Int
979 Int
2 Text
"Mexican Unidad de Inversion (UDI)"
    Alpha
MYR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MYR Int
458 Int
2 Text
"Malaysian Ringgit"
    Alpha
MZN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
MZN Int
943 Int
2 Text
"Mozambique Metical"
    Alpha
NAD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
NAD Int
516 Int
2 Text
"Namibia Dollar"
    Alpha
NGN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
NGN Int
566 Int
2 Text
"Naira"
    Alpha
NIO -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
NIO Int
558 Int
2 Text
"Cordoba Oro"
    Alpha
NOK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
NOK Int
578 Int
2 Text
"Norwegian Krone"
    Alpha
NPR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
NPR Int
524 Int
2 Text
"Nepalese Rupee"
    Alpha
NZD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
NZD Int
554 Int
2 Text
"New Zealand Dollar"
    Alpha
OMR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
OMR Int
512 Int
3 Text
"Rial Omani"
    Alpha
PAB -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
PAB Int
590 Int
2 Text
"Balboa"
    Alpha
PEN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
PEN Int
604 Int
2 Text
"Sol"
    Alpha
PGK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
PGK Int
598 Int
2 Text
"Kina"
    Alpha
PHP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
PHP Int
608 Int
2 Text
"Philippine Peso"
    Alpha
PKR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
PKR Int
586 Int
2 Text
"Pakistan Rupee"
    Alpha
PLN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
PLN Int
985 Int
2 Text
"Zloty"
    Alpha
PYG -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
PYG Int
600 Int
0 Text
"Guarani"
    Alpha
QAR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
QAR Int
634 Int
2 Text
"Qatari Rial"
    Alpha
RON -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
RON Int
946 Int
2 Text
"Romanian Leu"
    Alpha
RSD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
RSD Int
941 Int
2 Text
"Serbian Dinar"
    Alpha
RUB -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
RUB Int
643 Int
2 Text
"Russian Ruble"
    Alpha
RWF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
RWF Int
646 Int
0 Text
"Rwanda Franc"
    Alpha
SAR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SAR Int
682 Int
2 Text
"Saudi Riyal"
    Alpha
SBD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SBD Int
090 Int
2 Text
"Solomon Islands Dollar"
    Alpha
SCR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SCR Int
690 Int
2 Text
"Seychelles Rupee"
    Alpha
SDG -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SDG Int
938 Int
2 Text
"Sudanese Pound"
    Alpha
SEK -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SEK Int
752 Int
2 Text
"Swedish Krona"
    Alpha
SGD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SGD Int
702 Int
2 Text
"Singapore Dollar"
    Alpha
SHP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SHP Int
654 Int
2 Text
"Saint-Helena Pound"
    Alpha
SLL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SLL Int
694 Int
2 Text
"Leone"
    Alpha
SOS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SOS Int
706 Int
2 Text
"Somali Shilling"
    Alpha
SRD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SRD Int
968 Int
2 Text
"Surinam Dollar"
    Alpha
SSP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SSP Int
728 Int
2 Text
"South Sudanese Pound"
    Alpha
STD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
STD Int
678 Int
2 Text
"Dobra"
    Alpha
SVC -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SVC Int
222 Int
2 Text
"El Salvador Colon"
    Alpha
SYP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SYP Int
760 Int
2 Text
"Syrian Pound"
    Alpha
SZL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
SZL Int
748 Int
2 Text
"Lilangeni"
    Alpha
THB -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
THB Int
764 Int
2 Text
"Baht"
    Alpha
TJS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TJS Int
972 Int
2 Text
"Somoni"
    Alpha
TMT -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TMT Int
934 Int
2 Text
"Turkmenistan New Manat"
    Alpha
TND -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TND Int
788 Int
3 Text
"Tunisian Dinar"
    Alpha
TOP -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TOP Int
776 Int
2 Text
"Pa’anga"
    Alpha
TRY -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TRY Int
949 Int
2 Text
"Turkish Lira"
    Alpha
TTD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TTD Int
780 Int
2 Text
"Trinidad and Tobago Dollar"
    Alpha
TWD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TWD Int
901 Int
2 Text
"New Taiwan Dollar"
    Alpha
TZS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
TZS Int
834 Int
2 Text
"Tanzanian Shilling"
    Alpha
UAH -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
UAH Int
980 Int
2 Text
"Hryvnia"
    Alpha
UGX -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
UGX Int
800 Int
0 Text
"Uganda"
    Alpha
USD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
USD Int
840 Int
2 Text
"US Dollar"
    Alpha
USN -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
USN Int
997 Int
2 Text
"US Dollar (Next day)"
    Alpha
UYI -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
UYI Int
940 Int
0 Text
"Uruguay Peso en Unidades Indexadas (URUIURUI)"
    Alpha
UYU -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
UYU Int
858 Int
2 Text
"Peso Uruguayo"
    Alpha
UZS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
UZS Int
860 Int
2 Text
"Uzbekistan"
    Alpha
VEF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
VEF Int
937 Int
2 Text
"Bolívar"
    Alpha
VND -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
VND Int
704 Int
0 Text
"Dong"
    Alpha
VUV -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
VUV Int
548 Int
0 Text
"Vatu"
    Alpha
WST -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
WST Int
882 Int
2 Text
"Tala"
    Alpha
XAF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XAF Int
950 Int
0 Text
"CFA Franc BEAC"
    Alpha
XAG -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XAG Int
961 Int
0 Text
"Silver"
    Alpha
XAU -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XAU Int
959 Int
0 Text
"Gold"
    Alpha
XBA -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XBA Int
955 Int
0 Text
"Bond Markets Unit European Composite Unit (EURCO)"
    Alpha
XBB -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XBB Int
956 Int
0 Text
"Bond Markets Unit European Monetary Unit (E.M.U.-6)"
    Alpha
XBC -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XBC Int
957 Int
0 Text
"Bond Markets Unit European Unit of Account 9 (E.U.A.-9)"
    Alpha
XBD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XBD Int
958 Int
0 Text
"Bond Markets Unit European Unit of Account 17 (E.U.A.-17)"
    Alpha
XCD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XCD Int
951 Int
2 Text
"East Caribbean Dollar"
    Alpha
XDR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XDR Int
960 Int
0 Text
"SDR (Special Drawing Right)"
    Alpha
XOF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XOF Int
952 Int
0 Text
"CFA Franc BCEAO"
    Alpha
XPD -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XPD Int
964 Int
0 Text
"Palladium"
    Alpha
XPF -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XPF Int
953 Int
0 Text
"CFP Franc"
    Alpha
XPT -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XPT Int
962 Int
0 Text
"Platinum"
    Alpha
XSU -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XSU Int
994 Int
0 Text
"Sucre"
    Alpha
XTS -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XTS Int
963 Int
0 Text
"Codes specifically reserved for testing purposes"
    Alpha
XUA -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XUA Int
965 Int
0 Text
"ADB Unit of Account"
    Alpha
XXX -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
XXX Int
999 Int
0 Text
"The codes assigned for transactions where no currency is involved"
    Alpha
YER -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
YER Int
886 Int
2 Text
"Yemeni Rial"
    Alpha
ZAR -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ZAR Int
710 Int
2 Text
"Rand"
    Alpha
ZMW -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ZMW Int
967 Int
2 Text
"Zambian Kwacha"
    Alpha
ZWL -> Alpha -> Int -> Int -> Text -> Currency
Currency Alpha
ZWL Int
932 Int
2 Text
"Zimbabwe Dollar"


-- | List of all currencies in the standard
currencies :: [Currency]
currencies :: [Currency]
currencies =
  (Alpha -> Currency) -> [Alpha] -> [Currency]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Alpha -> Currency
fromAlpha [Alpha
forall a. Bounded a => a
minBound..Alpha
forall a. Bounded a => a
maxBound]


-- | List of all alpha constructors as strings
alphas :: [String]
alphas :: [String]
alphas =
  (Constr -> String) -> [Constr] -> [String]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Constr -> String
forall a. Show a => a -> String
show ([Constr] -> [String]) -> [Constr] -> [String]
forall a b. (a -> b) -> a -> b
$ DataType -> [Constr]
dataTypeConstrs (DataType -> [Constr]) -> DataType -> [Constr]
forall a b. (a -> b) -> a -> b
$ Alpha -> DataType
forall a. Data a => a -> DataType
dataTypeOf (Alpha
forall a. Bounded a => a
minBound :: Alpha)