module Facts.Geography.Countries ( Country (..)
, ISOAlpha2Code (..)
, ISOAlpha3Code (..)
, ISONumericCode
, UNFormalName
, UNShortName
, isoNumericCode
, shortEnglishCountryName
, formalEnglishCountryName
, isoAlpha2Code_for_country
, isoAlpha3Code_for_country
, country_for_isoAlpha2Code
, country_for_isoAlpha3Code
, isoNumericCode_for_country
, country_for_valid_isoNumericCode
, country_for_isoNumericCode
) where
import Data.Numerals.Decimal
import Facts.Geography.Countries.Internal.Splices
import Facts.Geography.Countries.Internal.Data
import Test.QuickCheck
import Test.QuickCheck.Gen
instance Show Country where
show = shortEnglishCountryName
isoAlpha2Code_for_country :: Country -> ISOAlpha2Code
isoAlpha3Code_for_country :: Country -> ISOAlpha3Code
isoNumericCode_for_country :: Country -> ISONumericCode
country_for_isoAlpha2Code :: ISOAlpha2Code -> Country
country_for_isoAlpha3Code :: ISOAlpha3Code -> Country
country_code_by_country = _country_code_by_country
country_by_country_code = _country_by_country_code
country_name_by_country = _country_name_by_country
isoAlpha2Code_for_country = _isoAlpha2_for_country
isoAlpha3Code_for_country = _isoAlpha3_for_country
isoNumericCode_for_country = _isoNumeric_for_country
country_for_isoAlpha2Code = _country_for_isoAlpha2
country_for_isoAlpha3Code = _country_for_isoAlpha3
country_for_isoNumericCode :: ISONumericCode -> Maybe Country
country_for_isoNumericCode = (fmap country_for_valid_isoNumericCode) . validate_isoNumericCode
country_for_valid_isoNumericCode :: ISONumericCode -> Country
country_for_valid_isoNumericCode = _country_for_isoNumeric
shortEnglishCountryName :: Country -> UNShortName
shortEnglishCountryName = _shortEnglishCountryName
formalEnglishCountryName :: Country -> UNFormalName
formalEnglishCountryName = _formalEnglishCountryName
instance Arbitrary Country where arbitrary = elements [Afghanistan .. Zimbabwe]
newtype ValidCode = ValidCode ISOCountryCode deriving (Show)
instance Arbitrary ValidCode where arbitrary = elements . fmap (ValidCode) $ valid_iso_country_codes
prop_country_to_code_roundtrip :: Country -> Bool
prop_country_to_code_roundtrip country = (country_by_country_code . country_code_by_country $ country) == country
prop_code_to_country_roundtrip :: ValidCode -> Bool
prop_code_to_country_roundtrip (ValidCode code) = (country_code_by_country . country_by_country_code $ code) == code