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

module Facts.Geography.Countries.UnitedStates.ZipCode where

import Data.Data
import Data.Numerals.Decimal
import Data.Typeable

type Digit = DecimalDigit
    
data ZipCode = ZipCode { zip_code ::       (Digit,Digit,Digit,Digit,Digit)
                       , plus4    :: Maybe (Digit,Digit,Digit,Digit)
                       } deriving (Data, Eq, Ord, Typeable)

instance Show ZipCode where
    show ( ZipCode (z1,z2,z3,z4,z5     ) 
                   (Just (p1,p2,p3,p4) ) )   = (concatMap show [z1,z2,z3,z4,z5])
                                            ++ " + " 
                                            ++ (concatMap show [p1,p2,p3,p4])    
    show ( ZipCode (z1,z2,z3,z4,z5) Nothing) = (concatMap show [z1,z2,z3,z4,z5])