module MagicHaskeller.FakeDynamic(
Dynamic,
fromDyn,
fromDynamic,
dynApply,
dynApp,
dynAppErr,
unsafeFromDyn,
unsafeToDyn,
aLittleSafeFromDyn,
fromPD,
dynamic, dynamicH
) where
import Data.Typeable
import GHC.Exts
import MagicHaskeller.Types
import MagicHaskeller.TyConLib
import Control.Monad
import qualified MagicHaskeller.PolyDynamic as PD
import MagicHaskeller.ReadTHType(thTypeToType)
import MagicHaskeller.ReadTypeRep(trToType)
import Language.Haskell.TH hiding (Type)
import MagicHaskeller.MHTH
import Data.Typeable(typeOf)
newtype Dynamic = Dynamic {unsafeFromDyn::forall a. a}
unsafeToDyn :: TyConLib -> Type -> a -> e -> Dynamic
unsafeToDyn _ tr a e = Dynamic (unsafeCoerce# a)
aLittleSafeFromDyn :: Type -> Dynamic -> a
aLittleSafeFromDyn _ (Dynamic o) = o
fromDyn :: Typeable a => TyConLib -> Dynamic -> a -> a
fromDyn tcl (Dynamic o) dflt = o
fromDynamic :: MonadPlus m => Type -> Dynamic -> m a
fromDynamic tr (Dynamic o) = return o
instance Show Dynamic where
showsPrec _ _ = showString "<< FakeDynamic >>"
dynApply :: Dynamic -> Dynamic -> Maybe Dynamic
dynApply f x = Just (dynApp f x)
dynApp :: Dynamic -> Dynamic -> Dynamic
dynApp (Dynamic f) (Dynamic x) = Dynamic ((unsafeCoerce# f) x)
dynAppErr :: String -> Dynamic -> Dynamic -> Dynamic
dynAppErr _ f x = dynApp f x
fromPD :: PD.Dynamic -> Dynamic
fromPD = Dynamic . PD.unsafeFromDyn
dynamic :: ExpQ -> ExpQ -> ExpQ
dynamic eqtcl eq = eq >>= p' eqtcl
dynamicH :: ExpQ -> Name -> TypeQ -> ExpQ
dynamicH eqtcl nm tq = do t <- tq
px eqtcl (VarE nm) t
p' eqtcl (SigE e ty) = px eqtcl e ty
p' eqtcl e = [| unsafeToDyn $eqtcl (trToType $eqtcl (typeOf $(return e))) $(return e) $(expToExpExp e) |]
px eqtcl e ty = [| unsafeToDyn $eqtcl (thTypeToType $eqtcl $(typeToExpType ty)) $(return se) $(expToExpExp se) |]
where se = SigE e ty