module Util.Dynamics (
Typeable(..),
TypeRep,
Dyn,
toDyn,
fromDynamic,
fromDynamicWE,
coerce,
coerceIO,
typeMismatch,
dynCast,
dynCastOpt
)
where
import qualified Data.Dynamic
import Data.Typeable
import Util.Computation
import Util.Debug(debug)
fromDynamic :: Typeable a => Dyn -> Maybe a
fromDynamic = Data.Dynamic.fromDynamic
fromDynamicWE :: Typeable a => Dyn -> WithError a
fromDynamicWE dyn =
case fromDynamic dyn of
Just a -> return a
(aOpt @ Nothing) ->
fail ("Dynamic type error. Looking for "
++ show (typeOf (typeHack aOpt))
++ " but found a " ++ show dyn)
where
typeHack :: Maybe a -> a
typeHack _ = undefined
type Dyn = Data.Dynamic.Dynamic
toDyn :: Typeable a => a -> Dyn
toDyn = Data.Dynamic.toDyn
coerce :: Typeable a => Dyn -> a
coerce d =
case fromDynamic d of
Just x -> x
coerceIO :: Typeable a => Dyn -> IO a
coerceIO d =
case fromDynamic d of
Nothing ->
do
debug "Dynamics.coerceIO failure"
ioError typeMismatch
(Just x) -> return x
typeMismatch :: IOError
typeMismatch =
userError "internal type of dynamics does not match expected type"
dynCast :: (Typeable a,Typeable b) => String -> a -> b
dynCast mess value = case dynCastOpt value of
Nothing -> error ("Dynamics.dynCast failure in "++mess)
Just value2 -> value2
dynCastOpt :: (Typeable a,Typeable b) => a -> Maybe b
dynCastOpt = Data.Dynamic.cast