import "Prelude" import "JavaBuiltin" as Java @JavaType "org.simantics.scl.compiler.dynamic.SafeDynamic" data SafeDynamic = @FieldNames [type_, value] SafeDynamic Type Dynamic instance Show SafeDynamic where sb <+ SafeDynamic t v = sb << "SafeDynamic " <+ t toSafeDynamic :: Typeable a => a -> SafeDynamic toSafeDynamic val = SafeDynamic (typeOf val) (toDynamic val) fromSafeDynamic :: Typeable a => SafeDynamic -> Maybe a fromSafeDynamic (SafeDynamic type_ value) = if type_ == typeOfProxy (TypeProxy :: TypeProxy a) then Just (Java.unsafeCoerce value) else Nothing forgetType :: SafeDynamic -> Dynamic forgetType (SafeDynamic _ value) = value typeOfSafeDynamic :: SafeDynamic -> Type typeOfSafeDynamic (SafeDynamic t _) = t