-- | 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; -} }