{-# LANGUAGE DeriveDataTypeable         #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeSynonymInstances       #-}

module Facts.Geography.Countries.UnitedStates ( State (..)
                                              , StateAbbreviation (..)
                                              , StateCode
                                              , OtherUSEntity (..)
                                              , state_by_state_code
                                              , state_code_by_state
                                              ) where


import Facts.Geography.Countries.UnitedStates.Internal.Data
import Facts.Geography.Countries.UnitedStates.Internal.Splices

import Data.Char
import Data.Data
import Data.Functor
import Data.Maybe
import Data.Typeable

import Test.QuickCheck
import Test.QuickCheck.Gen





instance Show State where
         show Alabama          =  "Alabama"
         show Alaska           =  "Alaska"
         show Arkansas         =  "Arkansas"
         show Arizona          =  "Arizona"
         show California       =  "California"
         show Colorodo         =  "Colorodo"
         show Connecticut      =  "Connecticut"
         show Delaware         =  "Delaware"
         show Florida          =  "Florida"
         show Georgia          =  "Georgia"
         show Hawaii           =  "Hawaii"
         show Idaho            =  "Idaho"
         show Illinois         =  "Illinois"
         show Indiana          =  "Indiana"
         show Iowa             =  "Iowa"
         show Kansas           =  "Kansas"
         show Kentucky         =  "Kentucky"
         show Louisiana        =  "Louisiana"
         show Maine            =  "Maine"
         show Maryland         =  "Maryland"
         show Massachusetts    =  "Massachusetts"
         show Michigan         =  "Michigan"
         show Minnesota        =  "Minnesota"
         show Mississippi      =  "Mississippi"
         show Missouri         =  "Missouri"
         show Montana          =  "Montana"
         show Nebraska         =  "Nebraska"
         show Nevada           =  "Nevada"
         show NewHampshire     =  "New Hampshire"
         show NewJersey        =  "New Jersey"
         show NewMexico        =  "New Mexico"
         show NewYork          =  "New York"
         show NorthCarolina    =  "North Carolina"
         show NorthDakota      =  "North Dakota"
         show Ohio             =  "Ohio"
         show Oklahoma         =  "Oklahoma"
         show Oregon           =  "Oregon"
         show Pennsylvania     =  "Pennsylvania"
         show RhodeIsland      =  "Rhode Island"
         show SouthCarolina    =  "South Carolina"
         show SouthDakota      =  "South Dakota"
         show Tennessee        =  "Tennessee"
         show Texas            =  "Texas"
         show Utah             =  "Utah"
         show Vermont          =  "Vermont"
         show Virginia         =  "Virginia"
         show Washington       =  "Washington"
         show WestVirginia     =  "West Virginia"
         show Wisconsin        =  "Wisconsin"
         show Wyoming          =  "Wyoming"


type StateCode = StateAbbreviation


instance Arbitrary State where
         arbitrary = elements [Alabama .. Wyoming]

instance Arbitrary StateCode where
         arbitrary = elements [AL .. WY]
                                                        

         
prop_state_and_state_code_are_inverses :: State -> Bool
prop_state_and_state_code_are_inverses state = (state_by_state_code . state_code_by_state $ state) == state

prop_state_code_and_state_are_inverses :: StateCode -> Bool
prop_state_code_and_state_are_inverses code = (state_code_by_state . state_by_state_code $ code) == code