{-# Language StandaloneDeriving, DeriveDataTypeable, ExistentialQuantification, TypeFamilies #-} ----------------------------------------------------------------------------- -- -- Module : Base.Selector -- Copyright : Juergen Nicklisch-Franken -- License : LGPL -- -- Maintainer : maintainer@leksah.org -- Stability : provisional -- Portability : portabel -- -- | A Selector is a unique think, which has an attached type for values. -- It's String representation is not necessary unique! -- ----------------------------------------------------------------------------- module Base.Selector ( Selector(..), GenSelector(..), ) where import Data.Typeable (typeRepKey, cast, Typeable(..), Typeable) import Data.Maybe (fromJust) import System.IO.Unsafe (unsafePerformIO) ---- ---- | A type family for unique selectors ---- class (Eq alpha, Ord alpha, Show alpha, Typeable alpha) => Selector alpha where type ValueType alpha :: * -- -- | Boxing for selectors -- data GenSelector = forall alpha . Selector alpha => GS alpha deriving instance Show GenSelector -- | Equality and comparision for selectors instance Eq GenSelector where (==) (GS a) (GS b) = if typeOf a == typeOf b then fromJust (cast a) == b else False instance Ord GenSelector where compare (GS a) (GS b) = if typeOf a == typeOf b then compare (fromJust (cast a)) b else compare (unsafePerformIO $ typeRepKey $ typeOf a) (unsafePerformIO $ typeRepKey $ typeOf b)