]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/scl/SafeDynamic.scl
b113f8a60d1a923533cbb16784fd8d9bf4cfa727
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / SafeDynamic.scl
1 import "Prelude"
2 import "JavaBuiltin" as Java
3
4 @JavaType "org.simantics.scl.compiler.dynamic.SafeDynamic"
5 data SafeDynamic =
6     @FieldNames [type_, value]
7     SafeDynamic Type Dynamic
8
9 toSafeDynamic :: Typeable a => a -> SafeDynamic
10 toSafeDynamic val = SafeDynamic (typeOf val) (toDynamic val)
11
12 fromSafeDynamic :: Typeable a => SafeDynamic -> Maybe a
13 fromSafeDynamic (SafeDynamic type_ value) =
14     if type_ == typeOfProxy (TypeProxy :: TypeProxy a)
15     then Just (Java.unsafeCoerce value)
16     else Nothing
17
18 forgetType :: SafeDynamic -> Dynamic
19 forgetType (SafeDynamic _ value) = value
20
21 typeOfSafeDynamic :: SafeDynamic -> Type
22 typeOfSafeDynamic (SafeDynamic t _) = t