Eq-1.0: EqManips/Propreties.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
module EqManips.Propreties( Property( .. )
, TypeInfo( .. )
, obtainProp
) where
import Data.Maybe
-- | Class to attach static propreties to a type
-- minimum definition : getProps
class (Eq propKey) => Property onType propKey propVal
| propKey -> propVal where
-- | To retrieve all the propreties
-- of the current item
getProps :: onType -> [(propKey, propVal)]
-- | retrieve a propretie if it exists
getProp :: onType -> propKey -> Maybe propVal
getProp a what = lookup what $ getProps a
-- | Tell if the element as the propreties
-- passed as parameters
hasProp :: onType -> propKey -> Bool
hasProp a p = case getProp a p of
Nothing -> False
Just _ -> True
-- | Associate an unique meta information
-- to a type/value
class TypeInfo onType infoToken tokenType where
propOf :: onType -> infoToken -> tokenType
obtainProp :: (Property a p c) => a -> p -> c
obtainProp a = fromJust . getProp a