--- /dev/null
+import "Prelude"
+import "JavaBuiltin" as Java
+
+@JavaType "org.simantics.scl.compiler.dynamic.SafeDynamic"
+data SafeDynamic =
+ @FieldNames [type_, value]
+ SafeDynamic Type Dynamic
+
+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