]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.runtime/scl/Databoard.scl
Databoard and SCL enchancements.
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / Databoard.scl
diff --git a/bundles/org.simantics.scl.runtime/scl/Databoard.scl b/bundles/org.simantics.scl.runtime/scl/Databoard.scl
new file mode 100644 (file)
index 0000000..f813766
--- /dev/null
@@ -0,0 +1,279 @@
+import "Prelude"\r
+import "Random"\r
+\r
+/// Datatype ///\r
+\r
+"A data type component with component name and data type"\r
+@JavaType "org.simantics.databoard.type.Component"\r
+@FieldNames [name, "type"]\r
+data DatatypeComponent = DatatypeComponent String Datatype\r
+\r
+"""A data type that represents the data types supported by the Simantics\r
+Databoard plugin."""\r
+@JavaType "org.simantics.databoard.type.Datatype"\r
+data Datatype =\r
+    @JavaType "org.simantics.databoard.type.BooleanType"\r
+    BooleanType\r
+  | @JavaType "org.simantics.databoard.type.ByteType"\r
+    ByteType\r
+  | @JavaType "org.simantics.databoard.type.IntegerType"\r
+    IntegerType\r
+  | @JavaType "org.simantics.databoard.type.LongType"\r
+    LongType\r
+  | @JavaType "org.simantics.databoard.type.FloatType"\r
+    FloatType\r
+  | @JavaType "org.simantics.databoard.type.DoubleType"\r
+    DoubleType\r
+  | @JavaType "org.simantics.databoard.type.StringType"\r
+    StringType\r
+  | @JavaType "org.simantics.databoard.type.ArrayType"\r
+    @FieldNames [componentType]\r
+    ArrayType Datatype\r
+  | @JavaType "org.simantics.databoard.type.OptionalType"\r
+    @FieldNames [componentType]\r
+    OptionalType Datatype\r
+  | @JavaType "org.simantics.databoard.type.MapType"\r
+    @FieldNames [keyType, valueType]\r
+    MapType Datatype Datatype\r
+  | @JavaType "org.simantics.databoard.type.RecordType"\r
+    @FieldNames [components]\r
+    RecordType (Vector DatatypeComponent)\r
+  | @JavaType "org.simantics.databoard.type.UntionType"\r
+    @FieldNames [components]\r
+    UnionType (Vector DatatypeComponent)\r
+  | @JavaType "org.simantics.databoard.type.VariantType"\r
+    VariantType\r
+\r
+importJava "org.simantics.databoard.type.Datatype" where\r
+    @private\r
+    @JavaName toString\r
+    showDatatype :: Datatype -> String\r
+    \r
+    "Get the number of type components in an data type"\r
+    @JavaName getComponentCount\r
+    datatypeCompnentCount :: Datatype -> Integer\r
+\r
+    "Get a component type of a composite data type"\r
+    @JavaName getComponentType\r
+    datatypeComponentType :: Datatype -> ChildReference -> Datatype\r
+    \r
+    @private\r
+    @JavaName equals\r
+    datatypeEquals :: Datatype -> Datatype -> Boolean \r
+\r
+instance Show Datatype where\r
+    show = showDatatype\r
+\r
+instance Eq Datatype where\r
+    (==) = datatypeEquals\r
+\r
+/// Binding ///\r
+\r
+importJava "org.simantics.databoard.binding.Binding" where\r
+    "Check whether a dynamic object is an instance of a given binding"\r
+    @JavaName isInstance\r
+    isBindingInstance :: Binding Dynamic -> Dynamic -> Boolean\r
+\r
+    "Create a serializable object from a textual representation"\r
+    parseValueDefinition :: Serializable a => String -> a\r
+    \r
+    "Compare two serializable objects\n\nResult is -1, 0 or 1 depending the partial ordering of the objects."\r
+    @JavaName compare\r
+    compareObjects :: Serializable a => a -> a -> Integer\r
+\r
+    "Return true, if two serializable values are equal"    \r
+    @JavaName equals\r
+    serializableEq :: Serializable a => a -> a -> Boolean\r
+    \r
+    "The default value of a serializable type"\r
+    @JavaName createDefault\r
+    serializableDefaultValue :: Serializable a => a\r
+    \r
+    "Create a random value of a serializable type"\r
+    @JavaName createRandom\r
+    serializableRandomValue :: Serializable a => <Random> a\r
+    \r
+    "Get a textual representation of a serializable value"\r
+    @JavaName toString\r
+    showSerializable :: Serializable a => a -> String\r
+    \r
+    @private\r
+    @JavaName getComponent \r
+    getSerializableComponent_ :: Serializable a => a -> ChildReference -> Binding b -> b \r
+\r
+    "Get a component binding"\r
+    @JavaName getComponentBinding\r
+    getComponentBinding :: Binding a -> ChildReference -> Binding b\r
+    \r
+    @private\r
+    @JavaName equals\r
+    bindingEquals :: Binding a -> Binding a -> Boolean\r
+    \r
+instance Eq (Binding a) where\r
+   (==) = bindingEquals\r
+\r
+"Get a child data component of a composite serializable value"\r
+getSerializableComponent :: Serializable a => Serializable b => a -> ChildReference -> b\r
+getSerializableComponent object ref = getSerializableComponent_ object ref binding\r
+\r
+/// Serializer ///\r
+\r
+importJava "org.simantics.databoard.serialization.Serializer" where\r
+    "A data serializer for SCL type a" \r
+    data Serializer a\r
+\r
+    @private\r
+    @JavaName "serialize"    \r
+    serialize_ :: Serializer a -> a -> ByteArray\r
+    \r
+    @private\r
+    @JavaName "deserialize"\r
+    deserialize_ :: Serializer a -> ByteArray -> a\r
+\r
+importJava "org.simantics.databoard.Bindings" where\r
+    @private\r
+    @JavaName "getSerializer"\r
+    serializerOf :: Binding a -> Serializer a\r
+    \r
+    @private\r
+    @JavaName toString\r
+    bindingToString :: Binding a -> String\r
+\r
+    "Adapt between types using explicitly provided binding objects: `adapt_ value from to`"\r
+    @JavaName adapt\r
+    adapt_ :: a -> Binding a -> Binding b -> b\r
+    \r
+"Adapt value from one serializable type to another"\r
+adapt :: Serializable a => Serializable b => a -> b\r
+adapt x = adapt_ x binding binding\r
+    \r
+instance Show (Binding a) where\r
+    show = bindingToString\r
+\r
+"Serializes a value to a byte array using default serializer."\r
+serialize :: Serializable a => a -> ByteArray\r
+serialize v = serialize_ (serializerOf binding) v\r
+\r
+"Deserializes a value from a byte array using default serializer."\r
+deserialize :: Serializable a => ByteArray -> a\r
+deserialize ba = deserialize_ (serializerOf binding) ba\r
+\r
+importJava "org.simantics.databoard.Bindings" where\r
+    "Get a default binding for a given data type" \r
+    @JavaName getBinding    \r
+    datatypeBinding :: Datatype -> Binding Dynamic\r
+\r
+importJava "org.simantics.databoard.Datatypes" where\r
+    "Get a data type from a string representation"\r
+    @JavaName translate\r
+    translateDatatype :: String -> Datatype\r
+\r
+importJava "org.simantics.databoard.binding.mutable.Variant" where\r
+    // data Variant (in Builtins)\r
+    "Create a variant using an explicitly provided binding value (unchecked cast)"\r
+    @JavaName "<init>"\r
+    createVariant_ :: Binding Dynamic -> Dynamic -> Variant\r
+    \r
+    "Get the data type of a variant object"\r
+    @JavaName "type"\r
+    variantDatatype :: Variant -> Datatype\r
+    \r
+    "Get raw value contained by a variant (unchecked cast)"\r
+    @JavaName getValue\r
+    rawVariantValue :: Variant -> a\r
+    \r
+    "Create a variant from a raw object (based on Java class)"\r
+    @JavaName ofInstance\r
+    variantOf :: a -> Variant\r
+    \r
+    "Create a variant with explicitly provided binding and value"\r
+    @JavaName "<init>"\r
+    variant_ :: Binding a -> a -> Variant\r
+    \r
+    "Get value from a variant using a given binding"\r
+    @JavaName getValue\r
+    variantValue_ :: Variant -> Binding a -> a\r
+    \r
+    @private\r
+    @JavaName toString\r
+    showVariant :: Variant -> String\r
+    \r
+    "Get a component of compound data value in a variant"\r
+    @JavaName getComponent\r
+    variantComponent :: Variant -> ChildReference -> Variant\r
+\r
+"Create a variant of a given data type from an object in the default binding (unchecked, use with extreme caution)"\r
+createVariant :: Datatype -> Dynamic -> Variant\r
+createVariant dt v = createVariant_ (datatypeBinding dt) v\r
+\r
+"Create a variant from a serializable value"\r
+variant :: Serializable a => a -> Variant\r
+variant v = variant_ binding v\r
+\r
+"Get the value of a variant in a serializable type"\r
+variantValue :: Serializable a => Variant -> a\r
+variantValue v = variantValue_ v binding\r
+\r
+instance Show Variant where\r
+    show = showVariant\r
+\r
+"Get an element of a compound variant value using an index reference" \r
+variantElement :: Serializable a => Variant -> Integer -> a\r
+variantElement v i = variantValue (variantComponent v (indexReference i))\r
+\r
+importJava "org.simantics.databoard.accessor.reference.ChildReference" where\r
+    "A reference to a child element in a composite data type/binding or value"\r
+    data ChildReference\r
+\r
+    "Combine a list of child data object references into a single path reference"\r
+    @JavaName compile    \r
+    compileReference :: [ChildReference] -> ChildReference\r
+\r
+importJava "org.simantics.databoard.accessor.reference.IndexReference" where\r
+    """Get a reference to a child data object using an index (zero-based)\r
+* Element index of an array object\r
+* Field index of a record or union type\r
+* 0:\r
+  * Key component of a map type/binding\r
+  * Component of any single-component type/binding (optional, array)\r
+  * Contained value/type of any single-element object (optional, union, variant)\r
+* 1:\r
+  * Value component of a map type/binding\r
+    """\r
+    @JavaName "<init>"\r
+    indexReference :: Integer -> ChildReference\r
+\r
+importJava "org.simantics.databoard.accessor.reference.KeyReference" where\r
+    """Get a reference to a MapType child data object using a given key value\r
+* Contained value of a map object for a given key value\r
+    """\r
+    @JavaName "<init>"\r
+    keyReference :: Variant -> ChildReference\r
+\r
+importJava "org.simantics.databoard.accessor.reference.NameReference" where\r
+    """Get a reference to a child data object using a field name\r
+* A component name of a record or union data type/binding\r
+* "key": The key component of a map data type/binding\r
+* "value": The value component of a map data type/binding\r
+    """\r
+    @JavaName "<init>"\r
+    nameReference :: String -> ChildReference\r
+    \r
+importJava "org.simantics.databoard.accessor.reference.LabelReference" where\r
+    """Get a reference to a child data object using a label\r
+* A component name of a record or union data type/binding\r
+* A string representation of the index of a record or union data type/binding component\r
+* "v": The component type of an array/optional data type/binding\r
+* "0"/"key": The key component of a map data type/binding\r
+* "1"/"value": The value component of a map data type/binding\r
+    """\r
+    @JavaName "<init>"\r
+    labelReference :: String -> ChildReference\r
+\r
+importJava "org.simantics.databoard.accessor.reference.ComponentReference" where\r
+    """Get a reference to a component child data object\r
+* Component of an array/optional data type/binding\r
+* Contained value of an optional/variant/union object\r
+    """\r
+    @JavaName "<init>"\r
+    componentReference :: ChildReference\r