{-# LANGUAGE Safe, ExistentialQuantification, DeriveDataTypeable #-}
module Control.CUtils.Dyn (Dyn, value, makeDyn, determineType) where
import Data.Typeable
data Dyn = forall t. (Eq t, Show t, Typeable t) => Dyn t deriving Typeable
value :: (Typeable t) => Dyn -> Maybe t
value (Dyn x) = cast x
makeDyn :: (Eq t, Show t, Typeable t) => t -> Dyn
makeDyn = Dyn
determineType :: Dyn -> TypeRep
determineType (Dyn x) = typeOf x
instance Eq Dyn where
Dyn x1 == Dyn x2 = maybe False(==x2) (cast x1)
instance Show Dyn where
showsPrec prec (Dyn x) = showsPrec prec x