bork
[clean-tests.git] / dyneditors / DynamicEditor.dcl
diff --git a/dyneditors/DynamicEditor.dcl b/dyneditors/DynamicEditor.dcl
new file mode 100644 (file)
index 0000000..36d91b0
--- /dev/null
@@ -0,0 +1,38 @@
+definition module DynamicEditor
+
+// TODO: quantified variables with constraints?
+
+import iTasks
+
+:: DynamicEditor a =: DynamicEditor [DynamicCons]
+// phantom type only needed for top level
+:: DynamicEditorValue a = DynamicEditorValue !DynamicConsId !DEVal
+
+:: DEVal = DEApplication ![(!DynamicConsId, !DEVal)]
+         | DEJSONValue   !JSONNode
+
+derive class iTask DynamicEditorValue
+
+:: DynamicCons
+:: DynamicConsOption = HideIfOnlyChoice
+
+(<<@@@) infixl 2 :: !DynamicCons !DynamicConsOption -> DynamicCons
+(@@@>>) infixr 2 :: !DynamicConsOption !DynamicCons -> DynamicCons
+
+:: DynamicConsId :== String
+:: DynamicConsBuilder =     FunctionCons     !Dynamic
+                     | E.a: CustomEditorCons !(Editor a) & JSONEncode{|*|}, JSONDecode{|*|}, gText{|*|}, TC a
+                     |      ListCons         !Dynamic    //* must contain a value of type [a] -> b
+
+functionCons     :: !String !String !a          -> DynamicCons | TC a
+listCons         :: !String !String !([a] -> b) -> DynamicCons | TC a & TC b
+customEditorCons :: !String !String !(Editor a) -> DynamicCons | TC, JSONEncode{|*|}, JSONDecode{|*|}, gText{|*|} a
+// dynamic variants are required because this is the only way to use a quantified type variable
+functionConsDyn :: !String !String !Dynamic -> DynamicCons
+listConsDyn     :: !String !String !Dynamic -> DynamicCons
+
+dynamicEditor :: !(DynamicEditor a) -> Editor (DynamicEditorValue a) | TC a
+
+toValue              :: !(DynamicEditor a) !(DynamicEditorValue a) -> a | TC a
+dynEditorValToString :: !(DynamicEditor a) !(DynamicEditorValue a) -> String
+