{-|
Module      : Diplomacy.Zone
Description : ProvinceTarget with different Eq, Ord instances.
Copyright   : (c) Alexander Vieth, 2015
Licence     : BSD3
Maintainer  : aovieth@gmail.com
Stability   : experimental
Portability : non-portable (GHC only)
-}

{-# LANGUAGE AutoDeriveTypeable #-}
{-# LANGUAGE StandaloneDeriving #-}

module Diplomacy.Zone (

    Zone(..)

  , zoneProvinceTarget

  ) where

import Diplomacy.Province

-- | A ProvinceTarget in which coasts of the same Province are equal.
--   This notion is useful because the rules of Diplomacy state that each
--   Zone is occupied by at most one unit, i.e. there cannot be a unit at
--   two coasts of the same Province.
newtype Zone = Zone ProvinceTarget

deriving instance Show Zone

instance Eq Zone where
    Zone x == Zone y = case (x, y) of
        (Normal p1, Normal p2) -> p1 == p2
        (Special c1, Special c2) -> pcProvince c1 == pcProvince c2
        (Normal p, Special c) -> p == pcProvince c
        (Special c, Normal p) -> p == pcProvince c

instance Ord Zone where
    Zone x `compare` Zone y = case (x, y) of
        (Normal p1, Normal p2) -> p1 `compare` p2
        (Special c1, Special c2) -> pcProvince c1 `compare` pcProvince c2
        (Normal p, Special c) -> p `compare` pcProvince c
        (Special c, Normal p) -> pcProvince c `compare` p

zoneProvinceTarget :: Zone -> ProvinceTarget
zoneProvinceTarget (Zone pt) = pt