{-| Module : Diplomacy.Aligned Description : Align a value to a 'GreatPower'. Copyright : (c) Alexander Vieth, 2015 Licence : BSD3 Maintainer : aovieth@gmail.com Stability : experimental Portability : non-portable (GHC only) -} {-# LANGUAGE AutoDeriveTypeable #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE StandaloneDeriving #-} module Diplomacy.Aligned ( Aligned , align , alignedThing , alignedGreatPower ) where import Diplomacy.GreatPower -- | Something aligned to a @GreatPower@. data Aligned t where Aligned :: t -> GreatPower -> Aligned t deriving instance Eq t => Eq (Aligned t) deriving instance Ord t => Ord (Aligned t) deriving instance Show t => Show (Aligned t) instance Functor Aligned where fmap f (Aligned x y) = Aligned (f x) y align :: t -> GreatPower -> Aligned t align = Aligned alignedThing :: Aligned t -> t alignedThing (Aligned x _) = x alignedGreatPower :: Aligned t -> GreatPower alignedGreatPower (Aligned _ x) = x