packages feed

lhc-0.6.20081210.1: lib/base/src/Data/Typeable.hs

{-# OPTIONS_LHC -fffi #-}
module Data.Typeable(TypeRep,typeOf) where


data TypeRep

instance Eq TypeRep where
    (==) = primTypeRepEq

foreign import primitive typeOf :: a -> TypeRep
foreign import primitive typeOf1 :: t a -> TypeRep
foreign import primitive typeOf2 :: t a b -> TypeRep
foreign import primitive typeOf3 :: t a b c -> TypeRep
foreign import primitive typeOf4 :: t a b c d -> TypeRep
foreign import primitive typeOf5 :: t a b c d e -> TypeRep
foreign import primitive typeOf6 :: t a b c d e f -> TypeRep
foreign import primitive typeOf7 :: t a b c d e f g -> TypeRep
foreign import primitive typeRepEq :: TypeRep -> TypeRep -> Bool


-------------------------------------------------------------
--
--		Type-safe cast
--
-------------------------------------------------------------

-- | The type-safe cast operation
cast ::  a -> Maybe b
cast x = r
       where
	 r = if typeOf x == typeOf (fromJust r)
               then Just $ unsafeCoerce x
	       else Nothing

-- | A flexible variation parameterised in a type constructor
gcast :: c a -> Maybe (c b)
gcast x = r
 where
  r = if typeOf (getArg x) == typeOf (getArg (fromJust r))
        then Just $ unsafeCoerce x
        else Nothing
  getArg :: c x -> x
  getArg = undefined

-- | Cast for * -> *
gcast1 ::  c (t a) -> Maybe (c (t' a))
gcast1 x = r
 where
  r = if typeOf1 (getArg x) == typeOf1 (getArg (fromJust r))
       then Just $ unsafeCoerce x
       else Nothing
  getArg :: c x -> x
  getArg = undefined

-- | Cast for * -> * -> *
gcast2 ::  c (t a b) -> Maybe (c (t' a b))
gcast2 x = r
 where
  r = if typeOf2 (getArg x) == typeOf2 (getArg (fromJust r))
       then Just $ unsafeCoerce x
       else Nothing
  getArg :: c x -> x
  getArg = undefined