]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/scl/Databoard.scl
Merge commit 'e87f096'
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / Databoard.scl
1 import "Prelude"\r
2 import "Random"\r
3 \r
4 /// Datatype ///\r
5 \r
6 "A data type component with component name and data type"\r
7 @JavaType "org.simantics.databoard.type.Component"\r
8 @FieldNames [name, "type"]\r
9 data DatatypeComponent = DatatypeComponent String Datatype\r
10 \r
11 """A data type that represents the data types supported by the Simantics\r
12 Databoard plugin."""\r
13 @JavaType "org.simantics.databoard.type.Datatype"\r
14 data Datatype =\r
15     @JavaType "org.simantics.databoard.type.BooleanType"\r
16     BooleanType\r
17   | @JavaType "org.simantics.databoard.type.ByteType"\r
18     ByteType\r
19   | @JavaType "org.simantics.databoard.type.IntegerType"\r
20     IntegerType\r
21   | @JavaType "org.simantics.databoard.type.LongType"\r
22     LongType\r
23   | @JavaType "org.simantics.databoard.type.FloatType"\r
24     FloatType\r
25   | @JavaType "org.simantics.databoard.type.DoubleType"\r
26     DoubleType\r
27   | @JavaType "org.simantics.databoard.type.StringType"\r
28     StringType\r
29   | @JavaType "org.simantics.databoard.type.ArrayType"\r
30     @FieldNames [componentType]\r
31     ArrayType Datatype\r
32   | @JavaType "org.simantics.databoard.type.OptionalType"\r
33     @FieldNames [componentType]\r
34     OptionalType Datatype\r
35   | @JavaType "org.simantics.databoard.type.MapType"\r
36     @FieldNames [keyType, valueType]\r
37     MapType Datatype Datatype\r
38   | @JavaType "org.simantics.databoard.type.RecordType"\r
39     @FieldNames [components]\r
40     RecordType (Vector DatatypeComponent)\r
41   | @JavaType "org.simantics.databoard.type.UntionType"\r
42     @FieldNames [components]\r
43     UnionType (Vector DatatypeComponent)\r
44   | @JavaType "org.simantics.databoard.type.VariantType"\r
45     VariantType\r
46 \r
47 importJava "org.simantics.databoard.type.Datatype" where\r
48     @private\r
49     @JavaName toString\r
50     showDatatype :: Datatype -> String\r
51     \r
52     "Get the number of type components in an data type"\r
53     @JavaName getComponentCount\r
54     datatypeCompnentCount :: Datatype -> Integer\r
55 \r
56     "Get a component type of a composite data type"\r
57     @JavaName getComponentType\r
58     datatypeComponentType :: Datatype -> ChildReference -> Datatype\r
59     \r
60     @private\r
61     @JavaName equals\r
62     datatypeEquals :: Datatype -> Datatype -> Boolean \r
63 \r
64 instance Show Datatype where\r
65     show = showDatatype\r
66 \r
67 instance Eq Datatype where\r
68     (==) = datatypeEquals\r
69 \r
70 /// Binding ///\r
71 \r
72 importJava "org.simantics.databoard.binding.Binding" where\r
73     "Check whether a dynamic object is an instance of a given binding"\r
74     @JavaName isInstance\r
75     isBindingInstance :: Binding Dynamic -> Dynamic -> Boolean\r
76 \r
77     "Create a serializable object from a textual representation"\r
78     parseValueDefinition :: Serializable a => String -> a\r
79     \r
80     "Compare two serializable objects\n\nResult is -1, 0 or 1 depending the partial ordering of the objects."\r
81     @JavaName compare\r
82     compareObjects :: Serializable a => a -> a -> Integer\r
83 \r
84     "Return true, if two serializable values are equal"    \r
85     @JavaName equals\r
86     serializableEq :: Serializable a => a -> a -> Boolean\r
87     \r
88     "The default value of a serializable type"\r
89     @JavaName createDefault\r
90     serializableDefaultValue :: Serializable a => a\r
91     \r
92     "Create a random value of a serializable type"\r
93     @JavaName createRandom\r
94     serializableRandomValue :: Serializable a => <Random> a\r
95     \r
96     "Get a textual representation of a serializable value"\r
97     @JavaName toString\r
98     showSerializable :: Serializable a => a -> String\r
99     \r
100     @private\r
101     @JavaName getComponent \r
102     getSerializableComponent_ :: Serializable a => a -> ChildReference -> Binding b -> b \r
103 \r
104     "Get a component binding"\r
105     @JavaName getComponentBinding\r
106     getComponentBinding :: Binding a -> ChildReference -> Binding b\r
107     \r
108     @private\r
109     @JavaName equals\r
110     bindingEquals :: Binding a -> Binding a -> Boolean\r
111     \r
112 instance Eq (Binding a) where\r
113    (==) = bindingEquals\r
114 \r
115 "Get a child data component of a composite serializable value"\r
116 getSerializableComponent :: Serializable a => Serializable b => a -> ChildReference -> b\r
117 getSerializableComponent object ref = getSerializableComponent_ object ref binding\r
118 \r
119 /// Serializer ///\r
120 \r
121 importJava "org.simantics.databoard.serialization.Serializer" where\r
122     "A data serializer for SCL type a" \r
123     data Serializer a\r
124 \r
125     @private\r
126     @JavaName "serialize"    \r
127     serialize_ :: Serializer a -> a -> ByteArray\r
128     \r
129     @private\r
130     @JavaName "deserialize"\r
131     deserialize_ :: Serializer a -> ByteArray -> a\r
132 \r
133 importJava "org.simantics.databoard.Bindings" where\r
134     @private\r
135     @JavaName "getSerializer"\r
136     serializerOf :: Binding a -> Serializer a\r
137     \r
138     @private\r
139     @JavaName toString\r
140     bindingToString :: Binding a -> String\r
141 \r
142     "Adapt between types using explicitly provided binding objects: `adapt_ value from to`"\r
143     @JavaName adapt\r
144     adapt_ :: a -> Binding a -> Binding b -> b\r
145     \r
146 "Adapt value from one serializable type to another"\r
147 adapt :: Serializable a => Serializable b => a -> b\r
148 adapt x = adapt_ x binding binding\r
149     \r
150 instance Show (Binding a) where\r
151     show = bindingToString\r
152 \r
153 "Serializes a value to a byte array using default serializer."\r
154 serialize :: Serializable a => a -> ByteArray\r
155 serialize v = serialize_ (serializerOf binding) v\r
156 \r
157 "Deserializes a value from a byte array using default serializer."\r
158 deserialize :: Serializable a => ByteArray -> a\r
159 deserialize ba = deserialize_ (serializerOf binding) ba\r
160 \r
161 importJava "org.simantics.databoard.Bindings" where\r
162     "Get a default binding for a given data type" \r
163     @JavaName getBinding    \r
164     datatypeBinding :: Datatype -> Binding Dynamic\r
165 \r
166 importJava "org.simantics.databoard.Datatypes" where\r
167     "Get a data type from a string representation"\r
168     @JavaName translate\r
169     translateDatatype :: String -> Datatype\r
170 \r
171 importJava "org.simantics.databoard.binding.mutable.Variant" where\r
172     // data Variant (in Builtins)\r
173     "Create a variant using an explicitly provided binding value (unchecked cast)"\r
174     @JavaName "<init>"\r
175     createVariant_ :: Binding Dynamic -> Dynamic -> Variant\r
176     \r
177     "Get the data type of a variant object"\r
178     @JavaName "type"\r
179     variantDatatype :: Variant -> Datatype\r
180     \r
181     "Get raw value contained by a variant (unchecked cast)"\r
182     @JavaName getValue\r
183     rawVariantValue :: Variant -> a\r
184     \r
185     "Create a variant from a raw object (based on Java class)"\r
186     @JavaName ofInstance\r
187     variantOf :: a -> Variant\r
188     \r
189     "Create a variant with explicitly provided binding and value"\r
190     @JavaName "<init>"\r
191     variant_ :: Binding a -> a -> Variant\r
192     \r
193     "Get value from a variant using a given binding"\r
194     @JavaName getValue\r
195     variantValue_ :: Variant -> Binding a -> a\r
196     \r
197     @private\r
198     @JavaName toString\r
199     showVariant :: Variant -> String\r
200     \r
201     "Get a component of compound data value in a variant"\r
202     @JavaName getComponent\r
203     variantComponent :: Variant -> ChildReference -> Variant\r
204 \r
205 "Create a variant of a given data type from an object in the default binding (unchecked, use with extreme caution)"\r
206 createVariant :: Datatype -> Dynamic -> Variant\r
207 createVariant dt v = createVariant_ (datatypeBinding dt) v\r
208 \r
209 "Create a variant from a serializable value"\r
210 variant :: Serializable a => a -> Variant\r
211 variant v = variant_ binding v\r
212 \r
213 "Get the value of a variant in a serializable type"\r
214 variantValue :: Serializable a => Variant -> a\r
215 variantValue v = variantValue_ v binding\r
216 \r
217 instance Show Variant where\r
218     show = showVariant\r
219 \r
220 "Get an element of a compound variant value using an index reference" \r
221 variantElement :: Serializable a => Variant -> Integer -> a\r
222 variantElement v i = variantValue (variantComponent v (indexReference i))\r
223 \r
224 importJava "org.simantics.databoard.accessor.reference.ChildReference" where\r
225     "A reference to a child element in a composite data type/binding or value"\r
226     data ChildReference\r
227 \r
228     "Combine a list of child data object references into a single path reference"\r
229     @JavaName compile    \r
230     compileReference :: [ChildReference] -> ChildReference\r
231 \r
232 importJava "org.simantics.databoard.accessor.reference.IndexReference" where\r
233     """Get a reference to a child data object using an index (zero-based)\r
234 * Element index of an array object\r
235 * Field index of a record or union type\r
236 * 0:\r
237   * Key component of a map type/binding\r
238   * Component of any single-component type/binding (optional, array)\r
239   * Contained value/type of any single-element object (optional, union, variant)\r
240 * 1:\r
241   * Value component of a map type/binding\r
242     """\r
243     @JavaName "<init>"\r
244     indexReference :: Integer -> ChildReference\r
245 \r
246 importJava "org.simantics.databoard.accessor.reference.KeyReference" where\r
247     """Get a reference to a MapType child data object using a given key value\r
248 * Contained value of a map object for a given key value\r
249     """\r
250     @JavaName "<init>"\r
251     keyReference :: Variant -> ChildReference\r
252 \r
253 importJava "org.simantics.databoard.accessor.reference.NameReference" where\r
254     """Get a reference to a child data object using a field name\r
255 * A component name of a record or union data type/binding\r
256 * "key": The key component of a map data type/binding\r
257 * "value": The value component of a map data type/binding\r
258     """\r
259     @JavaName "<init>"\r
260     nameReference :: String -> ChildReference\r
261     \r
262 importJava "org.simantics.databoard.accessor.reference.LabelReference" where\r
263     """Get a reference to a child data object using a label\r
264 * A component name of a record or union data type/binding\r
265 * A string representation of the index of a record or union data type/binding component\r
266 * "v": The component type of an array/optional data type/binding\r
267 * "0"/"key": The key component of a map data type/binding\r
268 * "1"/"value": The value component of a map data type/binding\r
269     """\r
270     @JavaName "<init>"\r
271     labelReference :: String -> ChildReference\r
272 \r
273 importJava "org.simantics.databoard.accessor.reference.ComponentReference" where\r
274     """Get a reference to a component child data object\r
275 * Component of an array/optional data type/binding\r
276 * Contained value of an optional/variant/union object\r
277     """\r
278     @JavaName "<init>"\r
279     componentReference :: ChildReference\r