open-witness-0.3.1: Data/OpenWitness/Dynamic.hs
-- | This is an approximate re-implementation of "Data.Dynamic" using open witnesses.
module Data.OpenWitness.Dynamic where
{
{-
import Data.Witness;
import Data.OpenWitness.OpenRep;
import Data.OpenWitness.Typeable;
-- * The @Dynamic@ type
;
type Dynamic = Any OpenRep;
-- * Converting to and from @Dynamic@
;
toDyn :: Typeable a => a -> Dynamic;
toDyn = MkAny rep;
fromDyn :: Typeable a => Dynamic -> a -> a;
fromDyn dyn def = case fromDynamic dyn of
{
Just a -> a;
_ -> def;
};
fromDynamic :: forall a. Typeable a => Dynamic -> Maybe a;
fromDynamic (MkAny uq a) = do
{
MkEqualType <- testEquality uq (rep :: OpenRep a);
return a;
};
-- * Applying functions of dynamic type
;
dynApply :: Dynamic -> Dynamic -> Maybe Dynamic;
dynApply (MkAny (ApplyOpenRep (ApplyOpenRep1 repFn' rx') ry) f) (MkAny rx x) = do
{
MkEqualType <- matchOpenRep2 repFn' (rep2 :: OpenRep2 (->));
MkEqualType <- testEquality rx' rx;
return (MkAny ry (f x));
};
dynApply _ _ = Nothing;
dynApp :: Dynamic -> Dynamic -> Dynamic;
dynApp a b = case (dynApply a b) of
{
Just d -> d;
_ -> error "Type error in dynamic application.\nCan't apply function to argument";
};
dynTypeRep :: Dynamic -> TypeRep;
dynTypeRep (MkAny r _) = MkAnyWitness r;
-}
}