ballerina-core 1.0.244 → 1.0.246

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/bin/main.js +1 -1
  2. package/bin/src/api-response-handler/coroutines/runner.js +13 -20
  3. package/bin/src/api-response-handler/state.js +11 -13
  4. package/bin/src/apiResultStatus/state.d.ts +3 -10
  5. package/bin/src/apiResultStatus/state.js +5 -2
  6. package/bin/src/async/domains/mirroring/domains/collection/coroutines/synchronizers.js +196 -314
  7. package/bin/src/async/domains/mirroring/domains/collection/state.js +36 -126
  8. package/bin/src/async/domains/mirroring/domains/entity/domains/loaded-collection/state.js +11 -18
  9. package/bin/src/async/domains/mirroring/domains/entity/domains/loaded-collection-entity/state.js +19 -19
  10. package/bin/src/async/domains/mirroring/domains/entity/domains/loaded-entities/state.js +1 -1
  11. package/bin/src/async/domains/mirroring/domains/entity/domains/loaded-entity/state.js +18 -18
  12. package/bin/src/async/domains/mirroring/domains/entity/state.js +9 -18
  13. package/bin/src/async/domains/mirroring/domains/singleton/coroutines/synchronizers.js +83 -134
  14. package/bin/src/async/domains/mirroring/domains/singleton/state.js +8 -52
  15. package/bin/src/async/domains/mirroring/domains/synchronization-result/state.d.ts +7 -0
  16. package/bin/src/async/domains/mirroring/domains/synchronization-result/state.d.ts.map +1 -1
  17. package/bin/src/async/domains/mirroring/domains/synchronized-entities/state.js +4 -7
  18. package/bin/src/async/domains/promise/state.d.ts +4 -9
  19. package/bin/src/async/domains/promise/state.js +9 -20
  20. package/bin/src/async/domains/synchronized/coroutines/synchronize.js +28 -80
  21. package/bin/src/async/domains/synchronized/state.d.ts +7 -14
  22. package/bin/src/async/domains/synchronized/state.js +6 -16
  23. package/bin/src/async/state.d.ts +45 -56
  24. package/bin/src/async/state.js +97 -115
  25. package/bin/src/baseEntity/domains/identifiable/state.d.ts +11 -15
  26. package/bin/src/baseEntity/domains/identifiable/state.js +9 -9
  27. package/bin/src/collections/domains/array/state.d.ts +7 -7
  28. package/bin/src/collections/domains/array/state.js +5 -5
  29. package/bin/src/collections/domains/errors/state.d.ts +10 -10
  30. package/bin/src/collections/domains/errors/state.js +10 -10
  31. package/bin/src/collections/domains/immutable/domains/list/state.js +44 -46
  32. package/bin/src/collections/domains/immutable/domains/map/state.js +23 -41
  33. package/bin/src/collections/domains/immutable/domains/orderedMap/state.js +65 -84
  34. package/bin/src/collections/domains/immutable/domains/ordereredSet/state.d.ts +6 -6
  35. package/bin/src/collections/domains/immutable/domains/ordereredSet/state.js +6 -6
  36. package/bin/src/collections/domains/maybe/state.d.ts +9 -9
  37. package/bin/src/collections/domains/maybe/state.js +9 -12
  38. package/bin/src/collections/domains/product/state.d.ts +19 -25
  39. package/bin/src/collections/domains/product/state.js +10 -13
  40. package/bin/src/collections/domains/sum/state.d.ts +77 -101
  41. package/bin/src/collections/domains/sum/state.js +32 -49
  42. package/bin/src/collections/domains/valueOrErrors/state.js +56 -81
  43. package/bin/src/coroutines/builder.js +19 -40
  44. package/bin/src/coroutines/state.js +306 -381
  45. package/bin/src/coroutines/template.js +59 -97
  46. package/bin/src/debounced/coroutines/debounce.js +89 -115
  47. package/bin/src/debounced/state.js +25 -62
  48. package/bin/src/diagnostics/domains/message-box/state.d.ts +1 -1
  49. package/bin/src/diagnostics/domains/message-box/state.js +3 -3
  50. package/bin/src/foreignMutations/state.d.ts +3 -3
  51. package/bin/src/foreignMutations/state.js +1 -1
  52. package/bin/src/forms/domains/attachments/views/attachments-view.js +8 -30
  53. package/bin/src/forms/domains/collection/domains/reference/state.js +20 -26
  54. package/bin/src/forms/domains/collection/domains/selection/state.js +1 -1
  55. package/bin/src/forms/domains/dispatched-forms/built-ins/state.js +754 -2007
  56. package/bin/src/forms/domains/dispatched-forms/deserializer/coroutines/runner.js +44 -123
  57. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/apis/state.js +166 -339
  58. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/enum/state.js +27 -40
  59. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/list/state.js +40 -76
  60. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/lookup/state.js +59 -102
  61. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/map/state.js +29 -64
  62. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/nestedRenderer/state.js +30 -64
  63. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/one/state.js +33 -88
  64. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/primitive/state.js +13 -21
  65. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/readOnly/state.js +23 -52
  66. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/record/domains/recordFieldRenderer/state.js +18 -59
  67. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/record/state.js +55 -129
  68. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/stream/state.js +27 -43
  69. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/sum/state.js +23 -63
  70. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/sumUnitDate/state.js +22 -39
  71. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/domains/tableCellRenderer/state.js +11 -46
  72. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.d.ts +6 -1
  73. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.d.ts.map +1 -1
  74. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.js +50 -146
  75. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.js.map +1 -1
  76. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/tuple/state.js +29 -64
  77. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/union/state.js +33 -78
  78. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/state.js +62 -157
  79. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/types/state.js +569 -977
  80. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/state.js +94 -255
  81. package/bin/src/forms/domains/dispatched-forms/deserializer/state.js +90 -322
  82. package/bin/src/forms/domains/dispatched-forms/deserializer/template.js +2 -3
  83. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/base-64-file/state.js +3 -3
  84. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/base-64-file/template.js +23 -49
  85. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/boolean/state.js +3 -3
  86. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/boolean/template.js +24 -52
  87. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/date/state.js +6 -18
  88. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/date/template.js +30 -64
  89. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum/state.js +6 -9
  90. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum/template.js +60 -153
  91. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum-multiselect/state.js +1 -1
  92. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum-multiselect/template.js +50 -127
  93. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/injectables/state.js +22 -40
  94. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/state.js +13 -31
  95. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.d.ts +2 -2
  96. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.d.ts.map +1 -1
  97. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.js +142 -417
  98. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.js.map +1 -1
  99. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/lookup-type/state.js +1 -1
  100. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/lookup-type/template.js +8 -28
  101. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/map/state.js +18 -61
  102. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/map/template.js +90 -329
  103. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/number/state.js +3 -3
  104. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/number/template.js +23 -54
  105. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/_debouncer.js +10 -22
  106. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/_initializeOne.js +31 -49
  107. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/_initializeStream.js +10 -29
  108. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/builder.js +2 -2
  109. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/runner.js +26 -47
  110. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/state.js +40 -88
  111. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/template.js +152 -386
  112. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/readOnly/state.js +10 -19
  113. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/readOnly/template.js +21 -78
  114. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/record/state.js +11 -32
  115. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/record/template.js +77 -222
  116. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream/state.js +13 -35
  117. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream/template.js +68 -195
  118. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream-multiselect/state.js +13 -36
  119. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream-multiselect/template.js +106 -246
  120. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/secret/state.js +3 -3
  121. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/secret/template.js +23 -54
  122. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/state.js +27 -40
  123. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/string/state.js +3 -3
  124. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/string/template.js +26 -58
  125. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/sum/state.js +7 -22
  126. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/sum/template.js +53 -188
  127. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/builder.js +2 -2
  128. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/infiniteLoader.js +24 -57
  129. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/initialiseFiltersAndSorting.js +20 -70
  130. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/initialiseTable.js +27 -61
  131. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/loadWithRetries.js +19 -38
  132. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/runner.js +15 -43
  133. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.d.ts +4 -0
  134. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.d.ts.map +1 -1
  135. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.js +137 -301
  136. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.d.ts +6 -2
  137. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.d.ts.map +1 -1
  138. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.js +238 -622
  139. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.js.map +1 -1
  140. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/tuple/state.js +8 -20
  141. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/tuple/template.js +35 -132
  142. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/union/state.js +8 -21
  143. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/union/template.js +32 -103
  144. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/unit/state.js +9 -12
  145. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/unit/template.js +20 -54
  146. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.d.ts +8 -0
  147. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.d.ts.map +1 -1
  148. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.js +537 -676
  149. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.js.map +1 -1
  150. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/list/state.js +18 -58
  151. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/lookup/state.js +14 -45
  152. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/map/state.js +18 -76
  153. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/multiSelection/state.js +24 -82
  154. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/nestedDispatcher/state.js +8 -37
  155. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/one/state.js +36 -120
  156. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/primitive/state.js +63 -145
  157. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/readOnly/state.js +12 -44
  158. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/record/recordField/state.js +4 -14
  159. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/record/state.js +25 -81
  160. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/singleSelectionDispatcher/state.js +24 -82
  161. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/sum/state.js +20 -63
  162. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.d.ts.map +1 -1
  163. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.js +74 -247
  164. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.js.map +1 -1
  165. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/tupleDispatcher/state.js +13 -61
  166. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/unionDispatcher/state.js +15 -64
  167. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/state.js +45 -144
  168. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/_init.js +95 -203
  169. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/_sync.js +37 -79
  170. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/builder.js +2 -2
  171. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/runner.js +17 -19
  172. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/state.js +11 -58
  173. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/template.js +25 -73
  174. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/_init.js +95 -205
  175. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/_sync.js +37 -78
  176. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/builder.js +2 -2
  177. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/runner.js +17 -19
  178. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/state.js +11 -58
  179. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/template.js +25 -71
  180. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/coroutines/runner.js +85 -163
  181. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/state.js +4 -10
  182. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/template.js +27 -72
  183. package/bin/src/forms/domains/dispatched-forms/runner/domains/traversal/state.js +423 -773
  184. package/bin/src/forms/domains/dispatched-forms/runner/state.js +38 -62
  185. package/bin/src/forms/domains/dispatched-forms/runner/template.js +25 -78
  186. package/bin/src/forms/domains/launcher/coroutines/runner.js +45 -120
  187. package/bin/src/forms/domains/launcher/domains/create/coroutines/runner.js +101 -240
  188. package/bin/src/forms/domains/launcher/domains/create/state.js +17 -62
  189. package/bin/src/forms/domains/launcher/domains/create/template.js +42 -84
  190. package/bin/src/forms/domains/launcher/domains/edit/coroutines/runner.js +103 -242
  191. package/bin/src/forms/domains/launcher/domains/edit/state.js +17 -62
  192. package/bin/src/forms/domains/launcher/domains/edit/template.js +43 -86
  193. package/bin/src/forms/domains/launcher/domains/merger/state.d.ts +4 -4
  194. package/bin/src/forms/domains/launcher/domains/merger/state.js +26 -35
  195. package/bin/src/forms/domains/launcher/domains/passthrough/coroutines/runner.js +42 -88
  196. package/bin/src/forms/domains/launcher/domains/passthrough/state.js +19 -44
  197. package/bin/src/forms/domains/launcher/domains/passthrough/template.js +34 -56
  198. package/bin/src/forms/domains/launcher/state.js +6 -6
  199. package/bin/src/forms/domains/launcher/template.js +85 -169
  200. package/bin/src/forms/domains/parser/coroutines/runner.js +25 -87
  201. package/bin/src/forms/domains/parser/domains/built-ins/state.js +533 -944
  202. package/bin/src/forms/domains/parser/domains/deltas/state.js +318 -444
  203. package/bin/src/forms/domains/parser/domains/injectables/state.js +26 -29
  204. package/bin/src/forms/domains/parser/domains/layout/state.d.ts +1 -1
  205. package/bin/src/forms/domains/parser/domains/layout/state.d.ts.map +1 -1
  206. package/bin/src/forms/domains/parser/domains/layout/state.js +183 -265
  207. package/bin/src/forms/domains/parser/domains/layout/state.js.map +1 -1
  208. package/bin/src/forms/domains/parser/domains/predicates/domains/extractor/state.js +162 -324
  209. package/bin/src/forms/domains/parser/domains/predicates/state.js +979 -1509
  210. package/bin/src/forms/domains/parser/domains/renderer/state.js +480 -1137
  211. package/bin/src/forms/domains/parser/domains/types/state.js +170 -355
  212. package/bin/src/forms/domains/parser/domains/validator/state.js +280 -417
  213. package/bin/src/forms/domains/parser/state.js +373 -612
  214. package/bin/src/forms/domains/parser/template.js +1 -1
  215. package/bin/src/forms/domains/primitives/domains/base-64-file/state.js +5 -5
  216. package/bin/src/forms/domains/primitives/domains/base-64-file/template.js +19 -38
  217. package/bin/src/forms/domains/primitives/domains/boolean/state.js +5 -5
  218. package/bin/src/forms/domains/primitives/domains/boolean/template.js +19 -38
  219. package/bin/src/forms/domains/primitives/domains/date/state.js +9 -18
  220. package/bin/src/forms/domains/primitives/domains/date/template.js +25 -51
  221. package/bin/src/forms/domains/primitives/domains/enum/state.js +6 -6
  222. package/bin/src/forms/domains/primitives/domains/enum/template.js +48 -117
  223. package/bin/src/forms/domains/primitives/domains/enum-multiselect/state.js +1 -1
  224. package/bin/src/forms/domains/primitives/domains/enum-multiselect/template.js +40 -99
  225. package/bin/src/forms/domains/primitives/domains/list/state.js +14 -14
  226. package/bin/src/forms/domains/primitives/domains/list/template.js +71 -200
  227. package/bin/src/forms/domains/primitives/domains/map/state.js +14 -14
  228. package/bin/src/forms/domains/primitives/domains/map/template.js +103 -294
  229. package/bin/src/forms/domains/primitives/domains/number/state.js +5 -5
  230. package/bin/src/forms/domains/primitives/domains/number/template.js +19 -38
  231. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream/state.js +16 -33
  232. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream/template.js +62 -171
  233. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream-multiselect/state.js +1 -1
  234. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream-multiselect/template.js +69 -182
  235. package/bin/src/forms/domains/primitives/domains/secret/state.js +5 -5
  236. package/bin/src/forms/domains/primitives/domains/secret/template.js +19 -38
  237. package/bin/src/forms/domains/primitives/domains/string/state.js +5 -5
  238. package/bin/src/forms/domains/primitives/domains/string/template.js +22 -42
  239. package/bin/src/forms/domains/primitives/domains/sum/state.js +10 -10
  240. package/bin/src/forms/domains/primitives/domains/sum/template.js +50 -141
  241. package/bin/src/forms/domains/primitives/domains/tuple/state.js +9 -9
  242. package/bin/src/forms/domains/primitives/domains/tuple/template.js +33 -100
  243. package/bin/src/forms/domains/primitives/domains/unit/state.js +8 -8
  244. package/bin/src/forms/domains/primitives/domains/unit/template.js +9 -22
  245. package/bin/src/forms/domains/singleton/domains/form-label/state.d.ts +4 -4
  246. package/bin/src/forms/domains/singleton/domains/form-label/state.js +1 -1
  247. package/bin/src/forms/domains/singleton/state.js +10 -12
  248. package/bin/src/forms/domains/singleton/template.js +113 -288
  249. package/bin/src/fun/domains/curry/state.d.ts +2 -4
  250. package/bin/src/fun/domains/curry/state.js +1 -1
  251. package/bin/src/fun/domains/id/state.d.ts +1 -1
  252. package/bin/src/fun/domains/id/state.js +1 -1
  253. package/bin/src/fun/domains/predicate/domains/bool-expr.d.ts +41 -57
  254. package/bin/src/fun/domains/predicate/domains/bool-expr.js +67 -76
  255. package/bin/src/fun/domains/predicate/state.d.ts +7 -9
  256. package/bin/src/fun/domains/predicate/state.js +10 -14
  257. package/bin/src/fun/domains/simpleCallback/state.d.ts +1 -1
  258. package/bin/src/fun/domains/simpleCallback/state.js +1 -1
  259. package/bin/src/fun/domains/uncurry/state.d.ts +2 -4
  260. package/bin/src/fun/domains/uncurry/state.js +1 -1
  261. package/bin/src/fun/domains/unit/state.d.ts +1 -1
  262. package/bin/src/fun/domains/unit/state.js +1 -1
  263. package/bin/src/fun/domains/updater/domains/caseUpdater/state.d.ts +7 -22
  264. package/bin/src/fun/domains/updater/domains/caseUpdater/state.js +10 -18
  265. package/bin/src/fun/domains/updater/domains/mapUpdater/state.d.ts +13 -24
  266. package/bin/src/fun/domains/updater/domains/mapUpdater/state.js +10 -40
  267. package/bin/src/fun/domains/updater/domains/maybeUpdater/state.d.ts +13 -19
  268. package/bin/src/fun/domains/updater/domains/maybeUpdater/state.js +9 -20
  269. package/bin/src/fun/domains/updater/domains/orderedMapUpdater/state.d.ts +13 -24
  270. package/bin/src/fun/domains/updater/domains/orderedMapUpdater/state.js +11 -47
  271. package/bin/src/fun/domains/updater/domains/orderedSetUpdater/state.d.ts +8 -20
  272. package/bin/src/fun/domains/updater/domains/orderedSetUpdater/state.js +5 -17
  273. package/bin/src/fun/domains/updater/domains/replaceWith/state.d.ts +1 -1
  274. package/bin/src/fun/domains/updater/domains/replaceWith/state.js +1 -1
  275. package/bin/src/fun/domains/updater/domains/simpleUpdater/domains/baseSimpleUpdater/state.d.ts +4 -13
  276. package/bin/src/fun/domains/updater/domains/simpleUpdater/domains/baseSimpleUpdater/state.js +4 -6
  277. package/bin/src/fun/domains/updater/domains/simpleUpdater/state.d.ts +22 -60
  278. package/bin/src/fun/domains/updater/domains/simpleUpdater/state.js +31 -42
  279. package/bin/src/fun/domains/updater/state.d.ts +4 -4
  280. package/bin/src/fun/domains/updater/state.js +10 -12
  281. package/bin/src/fun/state.d.ts +3 -3
  282. package/bin/src/fun/state.js +7 -9
  283. package/bin/src/infinite-data-stream/coroutines/builder.js +1 -1
  284. package/bin/src/infinite-data-stream/coroutines/infiniteLoader.js +20 -47
  285. package/bin/src/infinite-data-stream/coroutines/runner.js +7 -7
  286. package/bin/src/infinite-data-stream/state.d.ts +51 -84
  287. package/bin/src/infinite-data-stream/state.js +61 -125
  288. package/bin/src/infinite-data-stream/template.js +2 -3
  289. package/bin/src/math/domains/DOMRect/state.d.ts +4 -4
  290. package/bin/src/math/domains/DOMRect/state.js +8 -10
  291. package/bin/src/math/domains/number/state.d.ts +5 -5
  292. package/bin/src/math/domains/number/state.js +5 -5
  293. package/bin/src/math/domains/rect/state.d.ts +8 -8
  294. package/bin/src/math/domains/rect/state.js +15 -16
  295. package/bin/src/math/domains/rgba/state.d.ts +17 -17
  296. package/bin/src/math/domains/rgba/state.js +81 -77
  297. package/bin/src/math/domains/size2/state.d.ts +8 -8
  298. package/bin/src/math/domains/size2/state.js +6 -6
  299. package/bin/src/math/domains/vector2/state.d.ts +10 -10
  300. package/bin/src/math/domains/vector2/state.js +8 -8
  301. package/bin/src/queue/state.d.ts +3 -3
  302. package/bin/src/queue/state.d.ts.map +1 -1
  303. package/bin/src/queue/state.js +2 -2
  304. package/bin/src/queue/state.js.map +1 -1
  305. package/bin/src/state/domains/repository/state.d.ts +9 -15
  306. package/bin/src/state/domains/repository/state.js +1 -1
  307. package/bin/src/template/state.js +115 -163
  308. package/bin/src/validation/state.js +45 -38
  309. package/bin/src/value/domains/mutable-value/state.js +2 -3
  310. package/bin/src/value/state.d.ts +9 -9
  311. package/bin/src/value/state.js +8 -11
  312. package/bin/src/value-infinite-data-stream/coroutines/builder.js +1 -1
  313. package/bin/src/value-infinite-data-stream/coroutines/infiniteLoader.js +20 -55
  314. package/bin/src/value-infinite-data-stream/coroutines/runner.js +4 -6
  315. package/bin/src/value-infinite-data-stream/state.js +77 -199
  316. package/bin/src/value-infinite-data-stream/template.js +2 -4
  317. package/bin/src/visibility/state.d.ts +2 -5
  318. package/bin/src/visibility/state.js +1 -1
  319. package/package.json +1 -1
  320. package/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.ts +32 -15
  321. package/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.tsx +16 -3
  322. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.ts +1 -0
  323. package/src/forms/domains/parser/domains/layout/state.ts +11 -4
  324. package/src/queue/state.ts +8 -4
@@ -1,1585 +1,1055 @@
1
1
  import { Map, Set, List, OrderedMap } from "immutable";
2
- import {
3
- ValueOrErrors,
4
- MapRepo,
5
- Updater,
6
- simpleUpdater,
7
- replaceWith,
8
- ListRepo,
9
- } from "../../../../../../main";
2
+ import { ValueOrErrors, MapRepo, Updater, simpleUpdater, replaceWith, ListRepo, } from "../../../../../../main";
10
3
  const calculateVisibility = (expr, bindings) => {
11
- if (typeof expr == "boolean") {
12
- return ValueOrErrors.Default.return(expr);
13
- }
14
- return Expr.Operations.Evaluate(bindings)(expr).Then((result) => {
15
- if (typeof result == "boolean") {
16
- return ValueOrErrors.Default.return(result);
4
+ if (typeof expr == "boolean") {
5
+ return ValueOrErrors.Default.return(expr);
17
6
  }
18
- return ValueOrErrors.Default.throwOne(
19
- `Error: cannot evaluate expression ${JSON.stringify(expr)} to a boolean`,
20
- );
21
- });
7
+ return Expr.Operations.Evaluate(bindings)(expr).Then((result) => {
8
+ if (typeof result == "boolean") {
9
+ return ValueOrErrors.Default.return(result);
10
+ }
11
+ return ValueOrErrors.Default.throwOne(`Error: cannot evaluate expression ${JSON.stringify(expr)} to a boolean`);
12
+ });
22
13
  };
23
14
  export const FieldPredicateExpression = {
24
- Default: {
25
- unit: (value) => ({ kind: "unit", value }),
26
- primitive: (value) => ({
27
- kind: "primitive",
28
- value,
29
- }),
30
- record: (value, fields) => ({ kind: "record", value, fields }),
31
- list: (value, elementExpression) => ({
32
- kind: "list",
33
- value,
34
- elementExpression,
35
- }),
36
- map: (value, keyExpression, valueExpression) => ({
37
- kind: "map",
38
- value,
39
- keyExpression,
40
- valueExpression,
41
- }),
42
- tuple: (value, elementExpressions) => ({
43
- kind: "tuple",
44
- value,
45
- elementExpressions,
46
- }),
47
- sum: (value, leftExpression, rightExpression) => ({
48
- kind: "sum",
49
- value,
50
- leftExpression:
51
- leftExpression !== null && leftExpression !== void 0
52
- ? leftExpression
53
- : FieldPredicateExpression.Default.unit(false),
54
- rightExpression:
55
- rightExpression !== null && rightExpression !== void 0
56
- ? rightExpression
57
- : FieldPredicateExpression.Default.unit(false),
58
- }),
59
- },
15
+ Default: {
16
+ unit: (value) => ({ kind: "unit", value }),
17
+ primitive: (value) => ({
18
+ kind: "primitive",
19
+ value,
20
+ }),
21
+ record: (value, fields) => ({ kind: "record", value, fields }),
22
+ list: (value, elementExpression) => ({ kind: "list", value, elementExpression }),
23
+ map: (value, keyExpression, valueExpression) => ({
24
+ kind: "map",
25
+ value,
26
+ keyExpression,
27
+ valueExpression,
28
+ }),
29
+ tuple: (value, elementExpressions) => ({
30
+ kind: "tuple",
31
+ value,
32
+ elementExpressions,
33
+ }),
34
+ sum: (value, leftExpression, rightExpression) => ({
35
+ kind: "sum",
36
+ value,
37
+ leftExpression: leftExpression !== null && leftExpression !== void 0 ? leftExpression : FieldPredicateExpression.Default.unit(false),
38
+ rightExpression: rightExpression !== null && rightExpression !== void 0 ? rightExpression : FieldPredicateExpression.Default.unit(false),
39
+ }),
40
+ },
60
41
  };
61
42
  export const FormFieldPredicateEvaluation = {
62
- Default: {
63
- unit: (value) => ({
64
- kind: "unit",
65
- value,
66
- }),
67
- primitive: (value) => ({
68
- kind: "primitive",
69
- value,
70
- }),
71
- form: (value, fields) => ({ kind: "form", value, fields }),
72
- list: (value, elementValues) => ({
73
- kind: "list",
74
- value,
75
- elementValues,
76
- }),
77
- map: (value, elementValues) => ({ kind: "map", value, elementValues }),
78
- tuple: (value, elementValues) => ({
79
- kind: "tuple",
80
- value,
81
- elementValues,
82
- }),
83
- sum: (value, innerValue) => ({ kind: "sum", value, innerValue }),
84
- },
43
+ Default: {
44
+ unit: (value) => ({
45
+ kind: "unit",
46
+ value,
47
+ }),
48
+ primitive: (value) => ({
49
+ kind: "primitive",
50
+ value,
51
+ }),
52
+ form: (value, fields) => ({ kind: "form", value, fields }),
53
+ list: (value, elementValues) => ({
54
+ kind: "list",
55
+ value,
56
+ elementValues,
57
+ }),
58
+ map: (value, elementValues) => ({ kind: "map", value, elementValues }),
59
+ tuple: (value, elementValues) => ({
60
+ kind: "tuple",
61
+ value,
62
+ elementValues,
63
+ }),
64
+ sum: (value, innerValue) => ({ kind: "sum", value, innerValue }),
65
+ },
85
66
  };
86
67
  export const ValueRecord = {
87
- Default: {
88
- empty: () => ({ kind: "record", fields: OrderedMap() }),
89
- fromJSON: (json) => ({
90
- kind: "record",
91
- fields: OrderedMap(Object.assign({}, json)), // TODO - check this works ok
92
- }),
93
- fromMap: (map) => ({
94
- kind: "record",
95
- fields: OrderedMap(map),
96
- }),
97
- },
98
- Operations: {
99
- has: (record, key) => {
100
- return record.fields.has(key);
101
- },
102
- },
103
- Updaters: Object.assign(Object.assign({}, simpleUpdater()("fields")), {
104
- update: (key, updater) => {
105
- return ValueRecord.Updaters.fields(MapRepo.Updaters.update(key, updater));
106
- },
107
- set: (key, value) => {
108
- return ValueRecord.Updaters.fields(MapRepo.Updaters.set(key, value));
109
- },
110
- remove: (key) => {
111
- return ValueRecord.Updaters.fields(MapRepo.Updaters.remove(key));
68
+ Default: {
69
+ empty: () => ({ kind: "record", fields: OrderedMap() }),
70
+ fromJSON: (json) => ({
71
+ kind: "record",
72
+ fields: OrderedMap(Object.assign({}, json)), // TODO - check this works ok
73
+ }),
74
+ fromMap: (map) => ({
75
+ kind: "record",
76
+ fields: OrderedMap(map),
77
+ }),
112
78
  },
113
- clear: () => {
114
- return ValueRecord.Updaters.fields(replaceWith(OrderedMap()));
79
+ Operations: {
80
+ has: (record, key) => {
81
+ return record.fields.has(key);
82
+ },
115
83
  },
116
- }),
84
+ Updaters: Object.assign(Object.assign({}, simpleUpdater()("fields")), { update: (key, updater) => {
85
+ return ValueRecord.Updaters.fields(MapRepo.Updaters.update(key, updater));
86
+ }, set: (key, value) => {
87
+ return ValueRecord.Updaters.fields(MapRepo.Updaters.set(key, value));
88
+ }, remove: (key) => {
89
+ return ValueRecord.Updaters.fields(MapRepo.Updaters.remove(key));
90
+ }, clear: () => {
91
+ return ValueRecord.Updaters.fields(replaceWith(OrderedMap()));
92
+ } }),
117
93
  };
118
94
  export const ValueUnionCase = {
119
- Default: (caseName, fields) => ({
120
- kind: "unionCase",
121
- caseName,
122
- fields,
123
- }),
124
- Updaters: Object.assign(
125
- {
126
- case: (caseName) => (upd) =>
127
- Updater((v) => ValueUnionCase.Default(caseName, upd(v.fields))),
128
- },
129
- simpleUpdater()("fields"),
130
- ),
95
+ Default: (caseName, fields) => ({
96
+ kind: "unionCase",
97
+ caseName,
98
+ fields,
99
+ }),
100
+ Updaters: Object.assign({ case: (caseName) => (upd) => Updater((v) => ValueUnionCase.Default(caseName, upd(v.fields))) }, simpleUpdater()("fields")),
131
101
  };
132
102
  export const ValueUnit = {
133
- Default: () => ({ kind: "unit" }),
103
+ Default: () => ({ kind: "unit" }),
134
104
  };
135
105
  export const ValueOption = {
136
- Default: {
137
- some: (value) => ({
138
- kind: "option",
139
- isSome: true,
140
- value,
141
- }),
142
- none: () => ({
143
- kind: "option",
144
- isSome: false,
145
- value: { kind: "unit" },
146
- }),
147
- },
148
- Updaters: {
149
- value: (_) => Updater((v) => ValueOption.Default.some(_(v))),
150
- },
106
+ Default: {
107
+ some: (value) => ({
108
+ kind: "option",
109
+ isSome: true,
110
+ value,
111
+ }),
112
+ none: () => ({
113
+ kind: "option",
114
+ isSome: false,
115
+ value: { kind: "unit" },
116
+ }),
117
+ },
118
+ Updaters: {
119
+ value: (_) => Updater((v) => ValueOption.Default.some(_(v))),
120
+ },
151
121
  };
152
122
  export const ValueSum = {
153
- Default: (value) => ({
154
- kind: "sum",
155
- value,
156
- }),
157
- Updaters: Object.assign({}, simpleUpdater()("value")),
123
+ Default: (value) => ({
124
+ kind: "sum",
125
+ value,
126
+ }),
127
+ Updaters: Object.assign({}, simpleUpdater()("value")),
158
128
  };
159
129
  export const ValueSumN = {
160
- Default: (caseIndex, arity, value) => ({
161
- kind: "sumN",
162
- caseIndex,
163
- arity,
164
- value,
165
- }),
166
- Updaters: Object.assign(
167
- {
168
- case: (caseIndex) => (upd) =>
169
- Updater((v) => ValueSumN.Default(caseIndex, v.arity, upd(v.value))),
170
- },
171
- simpleUpdater()("value"),
172
- ),
130
+ Default: (caseIndex, arity, value) => ({
131
+ kind: "sumN",
132
+ caseIndex,
133
+ arity,
134
+ value,
135
+ }),
136
+ Updaters: Object.assign({ case: (caseIndex) => (upd) => Updater((v) => ValueSumN.Default(caseIndex, v.arity, upd(v.value))) }, simpleUpdater()("value")),
173
137
  };
174
138
  export const ValueTuple = {
175
- Default: () => ({
176
- kind: "tuple",
177
- values: List(),
178
- }),
179
- Updaters: Object.assign({}, simpleUpdater()("values")),
139
+ Default: () => ({
140
+ kind: "tuple",
141
+ values: List(),
142
+ }),
143
+ Updaters: Object.assign({}, simpleUpdater()("values")),
180
144
  };
181
145
  export const ValueTable = {
182
- Default: {
183
- empty: () => ({
184
- kind: "table",
185
- from: 0,
186
- to: 0,
187
- data: OrderedMap(),
188
- hasMoreValues: false,
189
- }),
190
- fromParsed: (from, to, hasMoreValues, data) => ({
191
- kind: "table",
192
- from,
193
- to,
194
- data,
195
- hasMoreValues,
196
- }),
197
- },
198
- Updaters: Object.assign({}, simpleUpdater()("data")),
146
+ Default: {
147
+ empty: () => ({
148
+ kind: "table",
149
+ from: 0,
150
+ to: 0,
151
+ data: OrderedMap(),
152
+ hasMoreValues: false,
153
+ }),
154
+ fromParsed: (from, to, hasMoreValues, data) => ({
155
+ kind: "table",
156
+ from,
157
+ to,
158
+ data,
159
+ hasMoreValues,
160
+ }),
161
+ },
162
+ Updaters: Object.assign({}, simpleUpdater()("data")),
199
163
  };
200
164
  export const ValueFilterContains = {
201
- Default: (contains) => ({
202
- kind: "contains",
203
- contains,
204
- }),
165
+ Default: (contains) => ({
166
+ kind: "contains",
167
+ contains,
168
+ }),
205
169
  };
206
170
  export const ValueFilterEqualsTo = {
207
- Default: (equalsTo) => ({
208
- kind: "=",
209
- equalsTo,
210
- }),
171
+ Default: (equalsTo) => ({
172
+ kind: "=",
173
+ equalsTo,
174
+ }),
211
175
  };
212
176
  export const ValueFilterNotEqualsTo = {
213
- Default: (notEqualsTo) => ({
214
- kind: "!=",
215
- notEqualsTo,
216
- }),
177
+ Default: (notEqualsTo) => ({
178
+ kind: "!=",
179
+ notEqualsTo,
180
+ }),
217
181
  };
218
182
  export const ValueFilterGreaterThanOrEqualsTo = {
219
- Default: (greaterThanOrEqualsTo) => ({
220
- kind: ">=",
221
- greaterThanOrEqualsTo,
222
- }),
183
+ Default: (greaterThanOrEqualsTo) => ({
184
+ kind: ">=",
185
+ greaterThanOrEqualsTo,
186
+ }),
223
187
  };
224
188
  export const ValueFilterGreaterThan = {
225
- Default: (greaterThan) => ({
226
- kind: ">",
227
- greaterThan,
228
- }),
189
+ Default: (greaterThan) => ({
190
+ kind: ">",
191
+ greaterThan,
192
+ }),
229
193
  };
230
194
  export const ValueFilterIsNotNull = {
231
- Default: () => ({
232
- kind: "!=null",
233
- }),
195
+ Default: () => ({
196
+ kind: "!=null",
197
+ }),
234
198
  };
235
199
  export const ValueFilterIsNull = {
236
- Default: () => ({
237
- kind: "=null",
238
- }),
200
+ Default: () => ({
201
+ kind: "=null",
202
+ }),
239
203
  };
240
204
  export const ValueFilterSmallerThanOrEqualsTo = {
241
- Default: (smallerThanOrEqualsTo) => ({
242
- kind: "<=",
243
- smallerThanOrEqualsTo,
244
- }),
205
+ Default: (smallerThanOrEqualsTo) => ({
206
+ kind: "<=",
207
+ smallerThanOrEqualsTo,
208
+ }),
245
209
  };
246
210
  export const ValueFilterSmallerThan = {
247
- Default: (smallerThan) => ({
248
- kind: "<",
249
- smallerThan,
250
- }),
211
+ Default: (smallerThan) => ({
212
+ kind: "<",
213
+ smallerThan,
214
+ }),
251
215
  };
252
216
  export const ValueFilterStartsWith = {
253
- Default: (startsWith) => ({
254
- kind: "startsWith",
255
- startsWith,
256
- }),
217
+ Default: (startsWith) => ({
218
+ kind: "startsWith",
219
+ startsWith,
220
+ }),
257
221
  };
258
222
  export const BinaryOperators = ["or", "equals"];
259
223
  export const BinaryOperatorsSet = Set(BinaryOperators);
260
224
  const defaultPredicateDate = () => {
261
- const d = new Date();
262
- d.setUTCHours(0, 0, 0, 0);
263
- return d;
225
+ const d = new Date();
226
+ d.setUTCHours(0, 0, 0, 0);
227
+ return d;
264
228
  };
265
229
  export const PredicateValue = {
266
- Default: {
267
- string: () => "",
268
- number: () => 0,
269
- boolean: () => false,
270
- date: () => defaultPredicateDate(),
271
- unit: () => ({ kind: "unit" }),
272
- tuple: (values) => ({
273
- kind: "tuple",
274
- values,
275
- }),
276
- record: (fields) => ({
277
- kind: "record",
278
- fields,
279
- }),
280
- unionCase: (caseName, fields) => ({
281
- kind: "unionCase",
282
- caseName,
283
- fields,
284
- }),
285
- option: (isSome, value) => ({
286
- kind: "option",
287
- isSome,
288
- value,
289
- }),
290
- varLookup: (varName) => ({
291
- kind: "varLookup",
292
- varName,
293
- }),
294
- sum: (value) => ({
295
- kind: "sum",
296
- value,
297
- }),
298
- sumN: (caseIndex, arity, value) => ({
299
- kind: "sumN",
300
- caseIndex,
301
- arity,
302
- value,
303
- }),
304
- table: (from, to, data, hasMoreValues) => ({
305
- kind: "table",
306
- from,
307
- to,
308
- data,
309
- hasMoreValues,
310
- }),
311
- readonly: (value) => ({
312
- kind: "readOnly",
313
- ReadOnly: value,
314
- }),
315
- filterContains: (contains) => ({
316
- kind: "contains",
317
- contains,
318
- }),
319
- filterEqualsTo: (equalsTo) => ({
320
- kind: "=",
321
- equalsTo,
322
- }),
323
- filterNotEqualsTo: (notEqualsTo) => ({
324
- kind: "!=",
325
- notEqualsTo,
326
- }),
327
- filterGreaterThanOrEqualsTo: (greaterThanOrEqualsTo) => ({
328
- kind: ">=",
329
- greaterThanOrEqualsTo,
330
- }),
331
- filterGreaterThan: (greaterThan) => ({
332
- kind: ">",
333
- greaterThan,
334
- }),
335
- filterIsNotNull: () => ({
336
- kind: "!=null",
337
- }),
338
- filterIsNull: () => ({
339
- kind: "=null",
340
- }),
341
- filterSmallerThanOrEqualsTo: (smallerThanOrEqualsTo) => ({
342
- kind: "<=",
343
- smallerThanOrEqualsTo,
344
- }),
345
- filterSmallerThan: (smallerThan) => ({
346
- kind: "<",
347
- smallerThan,
348
- }),
349
- filterStartsWith: (startsWith) => ({
350
- kind: "startsWith",
351
- startsWith,
352
- }),
353
- },
354
- Operations: {
355
- GetKind: (value) =>
356
- typeof value == "object"
357
- ? "kind" in value
358
- ? ValueOrErrors.Default.return(value.kind)
359
- : PredicateValue.Operations.IsDate(value)
360
- ? ValueOrErrors.Default.return("date")
361
- : ValueOrErrors.Default.throwOne("invalid")
362
- : ValueOrErrors.Default.return(typeof value),
363
- IsPrimitive: (value) => {
364
- return (
365
- PredicateValue.Operations.IsBoolean(value) ||
366
- PredicateValue.Operations.IsNumber(value) ||
367
- PredicateValue.Operations.IsString(value) ||
368
- PredicateValue.Operations.IsDate(value)
369
- );
370
- },
371
- IsBoolean: (value) => {
372
- return typeof value == "boolean";
373
- },
374
- IsNumber: (value) => {
375
- return typeof value == "number";
376
- },
377
- IsString: (value) => {
378
- return typeof value == "string";
379
- },
380
- IsDate: (value) => {
381
- return (
382
- typeof value == "object" &&
383
- Object.prototype.toString.call(value) === "[object Date]" &&
384
- value instanceof Date &&
385
- !isNaN(value.getTime())
386
- );
387
- },
388
- IsUnit: (value) => {
389
- return (
390
- typeof value == "object" &&
391
- !PredicateValue.Operations.IsDate(value) &&
392
- value.kind == "unit"
393
- );
394
- },
395
- IsUnionCase: (value) => {
396
- return (
397
- typeof value == "object" &&
398
- !PredicateValue.Operations.IsDate(value) &&
399
- value.kind == "unionCase"
400
- );
401
- },
402
- IsRecord: (value) => {
403
- return (
404
- typeof value == "object" &&
405
- !PredicateValue.Operations.IsDate(value) &&
406
- value.kind == "record"
407
- );
408
- },
409
- IsTuple: (value) => {
410
- return (
411
- typeof value == "object" &&
412
- !PredicateValue.Operations.IsDate(value) &&
413
- value.kind == "tuple"
414
- );
415
- },
416
- IsOption: (value) => {
417
- return (
418
- typeof value == "object" &&
419
- !PredicateValue.Operations.IsDate(value) &&
420
- value.kind == "option"
421
- );
422
- },
423
- IsTable: (value) => {
424
- return (
425
- typeof value == "object" &&
426
- !PredicateValue.Operations.IsDate(value) &&
427
- value.kind == "table"
428
- );
429
- },
430
- IsSum: (value) => {
431
- return (
432
- typeof value == "object" &&
433
- !PredicateValue.Operations.IsDate(value) &&
434
- value.kind == "sum"
435
- );
436
- },
437
- IsSumN: (value) => {
438
- return (
439
- typeof value == "object" &&
440
- !PredicateValue.Operations.IsDate(value) &&
441
- value.kind == "sumN"
442
- );
443
- },
444
- IsVarLookup: (value) => {
445
- return (
446
- typeof value == "object" &&
447
- !PredicateValue.Operations.IsDate(value) &&
448
- value.kind == "varLookup"
449
- );
450
- },
451
- IsCustom: (value) => {
452
- return (
453
- typeof value == "object" &&
454
- !PredicateValue.Operations.IsDate(value) &&
455
- value.kind == "custom"
456
- );
457
- },
458
- IsReadOnly: (value) => {
459
- return (
460
- typeof value == "object" &&
461
- !PredicateValue.Operations.IsDate(value) &&
462
- value.kind == "readOnly"
463
- );
464
- },
465
- IsFilterContains: (value) => {
466
- return (
467
- typeof value == "object" &&
468
- !PredicateValue.Operations.IsDate(value) &&
469
- value.kind == "contains"
470
- );
471
- },
472
- IsFilterEqualsTo: (value) => {
473
- return (
474
- typeof value == "object" &&
475
- !PredicateValue.Operations.IsDate(value) &&
476
- value.kind == "="
477
- );
478
- },
479
- IsFilterNotEqualsTo: (value) => {
480
- return (
481
- typeof value == "object" &&
482
- !PredicateValue.Operations.IsDate(value) &&
483
- value.kind == "!="
484
- );
485
- },
486
- IsFilterGreaterThanOrEqualsTo: (value) => {
487
- return (
488
- typeof value == "object" &&
489
- !PredicateValue.Operations.IsDate(value) &&
490
- value.kind == ">="
491
- );
492
- },
493
- IsFilterGreaterThan: (value) => {
494
- return (
495
- typeof value == "object" &&
496
- !PredicateValue.Operations.IsDate(value) &&
497
- value.kind == ">"
498
- );
499
- },
500
- IsFilterIsNotNull: (value) => {
501
- return (
502
- typeof value == "object" &&
503
- !PredicateValue.Operations.IsDate(value) &&
504
- value.kind == "!=null"
505
- );
506
- },
507
- IsFilterIsNull: (value) => {
508
- return (
509
- typeof value == "object" &&
510
- !PredicateValue.Operations.IsDate(value) &&
511
- value.kind == "=null"
512
- );
513
- },
514
- IsFilterSmallerThanOrEqualsTo: (value) => {
515
- return (
516
- typeof value == "object" &&
517
- !PredicateValue.Operations.IsDate(value) &&
518
- value.kind == "<="
519
- );
520
- },
521
- IsFilterSmallerThan: (value) => {
522
- return (
523
- typeof value == "object" &&
524
- !PredicateValue.Operations.IsDate(value) &&
525
- value.kind == "<"
526
- );
527
- },
528
- IsFilterStartsWith: (value) => {
529
- return (
530
- typeof value == "object" &&
531
- !PredicateValue.Operations.IsDate(value) &&
532
- value.kind == "startsWith"
533
- );
534
- },
535
- KindAndValueToFilter: (kind, value) => {
536
- switch (kind) {
537
- case "contains":
538
- return PredicateValue.Default.filterContains(value);
539
- case "=":
540
- return PredicateValue.Default.filterEqualsTo(value);
541
- case "!=":
542
- return PredicateValue.Default.filterNotEqualsTo(value);
543
- case ">=":
544
- return PredicateValue.Default.filterGreaterThanOrEqualsTo(value);
545
- case ">":
546
- return PredicateValue.Default.filterGreaterThan(value);
547
- case "!=null":
548
- return PredicateValue.Default.filterIsNotNull();
549
- case "=null":
550
- return PredicateValue.Default.filterIsNull();
551
- case "<=":
552
- return PredicateValue.Default.filterSmallerThanOrEqualsTo(value);
553
- case "<":
554
- return PredicateValue.Default.filterSmallerThan(value);
555
- case "startsWith":
556
- return PredicateValue.Default.filterStartsWith(value);
557
- default:
558
- return PredicateValue.Default.filterEqualsTo(value);
559
- }
560
- },
561
- FilterToKindAndValue: (filter) => {
562
- switch (filter.kind) {
563
- case "contains":
564
- return { kind: "contains", value: filter.contains };
565
- case "=":
566
- return { kind: "=", value: filter.equalsTo };
567
- case "!=":
568
- return { kind: "!=", value: filter.notEqualsTo };
569
- case ">=":
570
- return { kind: ">=", value: filter.greaterThanOrEqualsTo };
571
- case ">":
572
- return { kind: ">", value: filter.greaterThan };
573
- case "!=null":
574
- return { kind: "!=null", value: PredicateValue.Default.unit() };
575
- case "=null":
576
- return { kind: "=null", value: PredicateValue.Default.unit() };
577
- case "<=":
578
- return { kind: "<=", value: filter.smallerThanOrEqualsTo };
579
- case "<":
580
- return { kind: "<", value: filter.smallerThan };
581
- default:
582
- return { kind: "startsWith", value: filter.startsWith };
583
- }
584
- },
585
- ParseAsDate: (json) => {
586
- if (PredicateValue.Operations.IsDate(json))
587
- return ValueOrErrors.Default.return(json);
588
- return ValueOrErrors.Default.throwOne(`date has invalid value property`);
589
- },
590
- ParseAsVarLookup: (json) => {
591
- if (json.kind == "varLookup" && typeof json.varName == "string")
592
- return ValueOrErrors.Default.return(
593
- PredicateValue.Default.varLookup(json.varName),
594
- );
595
- return ValueOrErrors.Default.throwOne(
596
- `varLookup has invalid varName property`,
597
- );
598
- },
599
- ParseAsUnionCase: (json) => {
600
- if (typeof json.caseName == "string")
601
- return ValueOrErrors.Default.return(
602
- PredicateValue.Default.unionCase(json.caseName, json.value),
603
- );
604
- return ValueOrErrors.Default.throwOne(
605
- `union case has invalid caseName property`,
606
- );
607
- },
608
- ParseAsRecord: (json, types) => {
609
- if ("fields" in json && typeof json.fields == "object") {
610
- return ValueOrErrors.Operations.All(
611
- List(
612
- Object.entries(json.fields).map(([fieldName, fieldValue]) =>
613
- PredicateValue.Operations.parse(
614
- fieldValue,
615
- { kind: "expression" },
616
- types,
617
- ).Then((value) =>
618
- ValueOrErrors.Default.return([fieldName, value]),
619
- ),
620
- ),
621
- ),
622
- ).Then((entries) =>
623
- ValueOrErrors.Default.return(
624
- PredicateValue.Default.record(OrderedMap(entries)),
625
- ),
626
- );
627
- }
628
- return ValueOrErrors.Default.throwOne(`record has no field property`);
629
- },
630
- ParseAsTuple: (json, types) => {
631
- if (json.values != undefined && Array.isArray(json.values)) {
632
- return ValueOrErrors.Operations.All(
633
- List(
634
- json.values.map((elementValue) =>
635
- PredicateValue.Operations.parse(
636
- elementValue,
637
- { kind: "expression" },
638
- types,
639
- ),
640
- ),
641
- ),
642
- ).Then((values) =>
643
- ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)),
644
- );
645
- }
646
- return ValueOrErrors.Default.throwOne(
647
- `Error: tuple has no values property`,
648
- );
649
- },
650
- // TODO -- do we need to add table here ?
651
- parse: (json, type, types) => {
652
- const result = (() => {
653
- if (
654
- type.kind == "expression" &&
655
- (typeof json == "boolean" ||
656
- typeof json == "number" ||
657
- typeof json == "string")
658
- )
659
- return ValueOrErrors.Default.return(json);
660
- if (type.kind == "expression" && json.kind == undefined) {
661
- return ValueOrErrors.Default.throwOne(
662
- `evaluation statement has no kind value`,
663
- );
664
- }
665
- if (type.kind == "expression" && json.kind == "guid") {
666
- return ValueOrErrors.Default.return(json);
667
- }
668
- if (type.kind == "expression" && json.kind == "date") {
669
- return PredicateValue.Operations.ParseAsDate(json);
670
- }
671
- if (type.kind == "expression" && json.kind == "unit") {
672
- return ValueOrErrors.Default.return(PredicateValue.Default.unit());
673
- }
674
- if (type.kind == "expression" && json.kind == "varLookup") {
675
- return PredicateValue.Operations.ParseAsVarLookup(json);
676
- }
677
- if (
678
- type.kind == "expression" &&
679
- json.kind == "record" &&
680
- "caseName" in json
681
- ) {
682
- return PredicateValue.Operations.ParseAsUnionCase(json);
683
- }
684
- if (
685
- type.kind == "expression" &&
686
- json.kind == "record" &&
687
- "fields" in json
688
- ) {
689
- return PredicateValue.Operations.ParseAsRecord(json, types);
690
- }
691
- if (
692
- type.kind == "expression" &&
693
- json.kind == "tuple" &&
694
- "values" in json
695
- ) {
696
- return PredicateValue.Operations.ParseAsTuple(json, types);
697
- }
698
- if (type.kind == "primitive" && type.value == "Date") {
699
- if (PredicateValue.Operations.IsDate(json)) {
700
- return ValueOrErrors.Default.return(json);
701
- }
702
- return ValueOrErrors.Default.throwOne(
703
- `failed to parse date ${JSON.stringify(json)}`,
704
- );
705
- }
706
- if (type.kind == "primitive" && type.value == "maybeBoolean") {
707
- return json == undefined
708
- ? ValueOrErrors.Default.return(false)
709
- : ValueOrErrors.Default.return(json);
710
- }
711
- if (type.kind == "primitive") {
712
- return ValueOrErrors.Default.return(json);
713
- }
714
- if (type.kind == "lookup") {
715
- const subType = types.get(type.name);
716
- if (subType == undefined) {
717
- return ValueOrErrors.Default.throwOne(
718
- `cannot find field ${type.name} in types`,
719
- );
720
- }
721
- return PredicateValue.Operations.parse(json, subType, types);
722
- }
723
- if (type.kind == "union") {
724
- const unionCase = type.args.get(json);
725
- if (unionCase == undefined) {
726
- return ValueOrErrors.Default.throwOne(
727
- `Error: cannot find union case ${JSON.stringify(json)} in types`,
728
- );
729
- }
730
- return PredicateValue.Operations.ParseAsUnionCase({
230
+ Default: {
231
+ string: () => "",
232
+ number: () => 0,
233
+ boolean: () => false,
234
+ date: () => defaultPredicateDate(),
235
+ unit: () => ({ kind: "unit" }),
236
+ tuple: (values) => ({
237
+ kind: "tuple",
238
+ values,
239
+ }),
240
+ record: (fields) => ({
241
+ kind: "record",
242
+ fields,
243
+ }),
244
+ unionCase: (caseName, fields) => ({
731
245
  kind: "unionCase",
732
- caseName: json,
733
- value: { kind: "form", value: Map() },
734
- });
735
- }
736
- if (type.kind == "application" && type.value == "List") {
737
- return ValueOrErrors.Operations.All(
738
- List(
739
- json.map((elementValue) =>
740
- PredicateValue.Operations.parse(
741
- elementValue,
742
- type.args[0],
743
- types,
744
- ),
745
- ),
746
- ),
747
- ).Then((values) =>
748
- ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)),
749
- );
750
- }
751
- if (type.kind == "application" && type.value == "Map") {
752
- return ValueOrErrors.Operations.All(
753
- List(
754
- json.map((keyValue) =>
755
- PredicateValue.Operations.parse(
756
- keyValue.key,
757
- type.args[0],
758
- types,
759
- ).Then((key) =>
760
- PredicateValue.Operations.parse(
761
- keyValue.value,
762
- type === null || type === void 0 ? void 0 : type.args[1],
763
- types,
764
- ).Then((value) =>
765
- ValueOrErrors.Default.return(
766
- PredicateValue.Default.tuple(List([key, value])),
767
- ),
768
- ),
769
- ),
770
- ),
771
- ),
772
- ).Then((values) =>
773
- ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)),
774
- );
775
- }
776
- if (type.kind == "application" && type.value == "Sum") {
777
- return PredicateValue.Operations.parse(
778
- json.left,
779
- type === null || type === void 0 ? void 0 : type.args[0],
780
- types,
781
- ).Then((left) =>
782
- PredicateValue.Operations.parse(
783
- json.right,
784
- type === null || type === void 0 ? void 0 : type.args[1],
785
- types,
786
- ).Then((right) =>
787
- ValueOrErrors.Default.return(
788
- PredicateValue.Default.tuple(List([left, right])),
789
- ),
790
- ),
791
- );
792
- }
793
- if (type.kind == "application" && type.value == "SingleSelection") {
794
- ValueOrErrors.Default.return(
795
- PredicateValue.Default.option(json["IsSome"], json["Value"]),
796
- );
797
- }
798
- if (type.kind == "application" && type.value == "MultiSelection") {
799
- return ValueOrErrors.Operations.All(
800
- List(
801
- json.map((elementValue) =>
802
- PredicateValue.Operations.parse(
803
- elementValue,
804
- type.args[0],
805
- types,
806
- ),
807
- ),
808
- ),
809
- ).Then((values) =>
810
- ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)),
811
- );
812
- }
813
- if (type.kind == "record") {
814
- return ValueOrErrors.Operations.All(
815
- List(
816
- Object.entries(json).map(([fieldName, fieldValue]) => {
817
- const subType = type.fields.get(fieldName);
818
- if (subType == undefined) {
819
- return ValueOrErrors.Default.throwOne(
820
- `cannot find field ${fieldName} in type ${JSON.stringify(type)}`,
821
- );
822
- }
823
- return PredicateValue.Operations.parse(
824
- fieldValue,
825
- subType,
826
- types,
827
- ).Then((value) =>
828
- ValueOrErrors.Default.return([fieldName, value]),
829
- );
830
- }),
831
- ),
832
- ).Then((entries) =>
833
- ValueOrErrors.Default.return(
834
- PredicateValue.Default.record(
835
- OrderedMap(entries.map((_) => [_[0], _[1]])),
836
- ),
837
- ),
838
- );
839
- }
840
- return ValueOrErrors.Default.throwOne(
841
- `unsupported type ${JSON.stringify(type)}`,
842
- );
843
- })();
844
- return result.MapErrors((errors) =>
845
- errors.map(
846
- (error) =>
847
- `${error}\n...When parsing expression ${JSON.stringify(json, null, 2)}`,
848
- ),
849
- );
850
- },
851
- recordToTuple: (r) => {
852
- const valuesSortedByName = r.fields
853
- .toSeq()
854
- .map((v, k) => [k, v])
855
- .sortBy(([k, v]) => k)
856
- .map(([k, v]) => v)
857
- .valueSeq()
858
- .toArray();
859
- return PredicateValue.Default.tuple(List(valuesSortedByName));
246
+ caseName,
247
+ fields,
248
+ }),
249
+ option: (isSome, value) => ({
250
+ kind: "option",
251
+ isSome,
252
+ value,
253
+ }),
254
+ varLookup: (varName) => ({
255
+ kind: "varLookup",
256
+ varName,
257
+ }),
258
+ sum: (value) => ({
259
+ kind: "sum",
260
+ value,
261
+ }),
262
+ sumN: (caseIndex, arity, value) => ({
263
+ kind: "sumN",
264
+ caseIndex,
265
+ arity,
266
+ value,
267
+ }),
268
+ table: (from, to, data, hasMoreValues) => ({
269
+ kind: "table",
270
+ from,
271
+ to,
272
+ data,
273
+ hasMoreValues,
274
+ }),
275
+ readonly: (value) => ({
276
+ kind: "readOnly",
277
+ ReadOnly: value,
278
+ }),
279
+ filterContains: (contains) => ({
280
+ kind: "contains",
281
+ contains,
282
+ }),
283
+ filterEqualsTo: (equalsTo) => ({
284
+ kind: "=",
285
+ equalsTo,
286
+ }),
287
+ filterNotEqualsTo: (notEqualsTo) => ({
288
+ kind: "!=",
289
+ notEqualsTo,
290
+ }),
291
+ filterGreaterThanOrEqualsTo: (greaterThanOrEqualsTo) => ({
292
+ kind: ">=",
293
+ greaterThanOrEqualsTo,
294
+ }),
295
+ filterGreaterThan: (greaterThan) => ({
296
+ kind: ">",
297
+ greaterThan,
298
+ }),
299
+ filterIsNotNull: () => ({
300
+ kind: "!=null",
301
+ }),
302
+ filterIsNull: () => ({
303
+ kind: "=null",
304
+ }),
305
+ filterSmallerThanOrEqualsTo: (smallerThanOrEqualsTo) => ({
306
+ kind: "<=",
307
+ smallerThanOrEqualsTo,
308
+ }),
309
+ filterSmallerThan: (smallerThan) => ({
310
+ kind: "<",
311
+ smallerThan,
312
+ }),
313
+ filterStartsWith: (startsWith) => ({
314
+ kind: "startsWith",
315
+ startsWith,
316
+ }),
860
317
  },
861
- Equals: (vars) => (v1, v2) =>
862
- typeof v1 == "boolean" ||
863
- typeof v1 == "number" ||
864
- typeof v1 == "string" ||
865
- typeof v2 == "boolean" ||
866
- typeof v2 == "number" ||
867
- typeof v2 == "string"
868
- ? typeof v1 == typeof v2
869
- ? ValueOrErrors.Default.return(v1 == v2)
870
- : ValueOrErrors.Default.throwOne(
871
- `cannot compare expressions of different types ${JSON.stringify(v1)} and ${JSON.stringify(v2)}.`,
872
- )
873
- : PredicateValue.Operations.IsDate(v1) &&
874
- PredicateValue.Operations.IsDate(v2)
875
- ? v1.getTime() == v2.getTime()
876
- ? ValueOrErrors.Default.return(true)
877
- : ValueOrErrors.Default.return(false)
878
- : PredicateValue.Operations.IsUnionCase(v1) &&
879
- PredicateValue.Operations.IsUnionCase(v2)
880
- ? v1.caseName == v2.caseName
881
- ? PredicateValue.Operations.Equals(vars)(v1.fields, v2.fields)
882
- : ValueOrErrors.Default.return(false)
883
- : PredicateValue.Operations.IsTuple(v1) &&
884
- PredicateValue.Operations.IsTuple(v2)
885
- ? v1.values.size != v2.values.size
886
- ? ValueOrErrors.Default.return(false)
887
- : v1.values.size == 0
888
- ? ValueOrErrors.Default.return(true)
889
- : PredicateValue.Operations.Equals(vars)(
890
- v1.values.get(0),
891
- v2.values.get(0),
892
- ).Then((firstEqual) =>
893
- firstEqual
894
- ? PredicateValue.Operations.Equals(vars)(
895
- PredicateValue.Default.tuple(v1.values.slice(1)),
896
- PredicateValue.Default.tuple(v2.values.slice(1)),
897
- )
898
- : ValueOrErrors.Default.return(false),
899
- )
900
- : PredicateValue.Operations.IsRecord(v1) &&
901
- PredicateValue.Operations.IsRecord(v2)
902
- ? PredicateValue.Operations.Equals(vars)(
903
- PredicateValue.Operations.recordToTuple(v1),
904
- PredicateValue.Operations.recordToTuple(v2),
905
- )
906
- : PredicateValue.Operations.IsTable(v1) &&
907
- PredicateValue.Operations.IsTable(v2)
908
- ? v1.data.size == v2.data.size
909
- ? ValueOrErrors.Default.return(
910
- v1.data.keySeq().equals(v2.data.keySeq()),
911
- )
912
- : ValueOrErrors.Default.return(false)
913
- : PredicateValue.Operations.IsUnit(v1) &&
914
- PredicateValue.Operations.IsUnit(v2)
318
+ Operations: {
319
+ GetKind: (value) => typeof value == "object"
320
+ ? "kind" in value
321
+ ? ValueOrErrors.Default.return(value.kind)
322
+ : PredicateValue.Operations.IsDate(value)
323
+ ? ValueOrErrors.Default.return("date")
324
+ : ValueOrErrors.Default.throwOne("invalid")
325
+ : ValueOrErrors.Default.return(typeof value),
326
+ IsPrimitive: (value) => {
327
+ return (PredicateValue.Operations.IsBoolean(value) ||
328
+ PredicateValue.Operations.IsNumber(value) ||
329
+ PredicateValue.Operations.IsString(value) ||
330
+ PredicateValue.Operations.IsDate(value));
331
+ },
332
+ IsBoolean: (value) => {
333
+ return typeof value == "boolean";
334
+ },
335
+ IsNumber: (value) => {
336
+ return typeof value == "number";
337
+ },
338
+ IsString: (value) => {
339
+ return typeof value == "string";
340
+ },
341
+ IsDate: (value) => {
342
+ return (typeof value == "object" &&
343
+ Object.prototype.toString.call(value) === "[object Date]" &&
344
+ value instanceof Date &&
345
+ !isNaN(value.getTime()));
346
+ },
347
+ IsUnit: (value) => {
348
+ return (typeof value == "object" &&
349
+ !PredicateValue.Operations.IsDate(value) &&
350
+ value.kind == "unit");
351
+ },
352
+ IsUnionCase: (value) => {
353
+ return (typeof value == "object" &&
354
+ !PredicateValue.Operations.IsDate(value) &&
355
+ value.kind == "unionCase");
356
+ },
357
+ IsRecord: (value) => {
358
+ return (typeof value == "object" &&
359
+ !PredicateValue.Operations.IsDate(value) &&
360
+ value.kind == "record");
361
+ },
362
+ IsTuple: (value) => {
363
+ return (typeof value == "object" &&
364
+ !PredicateValue.Operations.IsDate(value) &&
365
+ value.kind == "tuple");
366
+ },
367
+ IsOption: (value) => {
368
+ return (typeof value == "object" &&
369
+ !PredicateValue.Operations.IsDate(value) &&
370
+ value.kind == "option");
371
+ },
372
+ IsTable: (value) => {
373
+ return (typeof value == "object" &&
374
+ !PredicateValue.Operations.IsDate(value) &&
375
+ value.kind == "table");
376
+ },
377
+ IsSum: (value) => {
378
+ return (typeof value == "object" &&
379
+ !PredicateValue.Operations.IsDate(value) &&
380
+ value.kind == "sum");
381
+ },
382
+ IsSumN: (value) => {
383
+ return (typeof value == "object" &&
384
+ !PredicateValue.Operations.IsDate(value) &&
385
+ value.kind == "sumN");
386
+ },
387
+ IsVarLookup: (value) => {
388
+ return (typeof value == "object" &&
389
+ !PredicateValue.Operations.IsDate(value) &&
390
+ value.kind == "varLookup");
391
+ },
392
+ IsCustom: (value) => {
393
+ return (typeof value == "object" &&
394
+ !PredicateValue.Operations.IsDate(value) &&
395
+ value.kind == "custom");
396
+ },
397
+ IsReadOnly: (value) => {
398
+ return (typeof value == "object" &&
399
+ !PredicateValue.Operations.IsDate(value) &&
400
+ value.kind == "readOnly");
401
+ },
402
+ IsFilterContains: (value) => {
403
+ return (typeof value == "object" &&
404
+ !PredicateValue.Operations.IsDate(value) &&
405
+ value.kind == "contains");
406
+ },
407
+ IsFilterEqualsTo: (value) => {
408
+ return (typeof value == "object" &&
409
+ !PredicateValue.Operations.IsDate(value) &&
410
+ value.kind == "=");
411
+ },
412
+ IsFilterNotEqualsTo: (value) => {
413
+ return (typeof value == "object" &&
414
+ !PredicateValue.Operations.IsDate(value) &&
415
+ value.kind == "!=");
416
+ },
417
+ IsFilterGreaterThanOrEqualsTo: (value) => {
418
+ return (typeof value == "object" &&
419
+ !PredicateValue.Operations.IsDate(value) &&
420
+ value.kind == ">=");
421
+ },
422
+ IsFilterGreaterThan: (value) => {
423
+ return (typeof value == "object" &&
424
+ !PredicateValue.Operations.IsDate(value) &&
425
+ value.kind == ">");
426
+ },
427
+ IsFilterIsNotNull: (value) => {
428
+ return (typeof value == "object" &&
429
+ !PredicateValue.Operations.IsDate(value) &&
430
+ value.kind == "!=null");
431
+ },
432
+ IsFilterIsNull: (value) => {
433
+ return (typeof value == "object" &&
434
+ !PredicateValue.Operations.IsDate(value) &&
435
+ value.kind == "=null");
436
+ },
437
+ IsFilterSmallerThanOrEqualsTo: (value) => {
438
+ return (typeof value == "object" &&
439
+ !PredicateValue.Operations.IsDate(value) &&
440
+ value.kind == "<=");
441
+ },
442
+ IsFilterSmallerThan: (value) => {
443
+ return (typeof value == "object" &&
444
+ !PredicateValue.Operations.IsDate(value) &&
445
+ value.kind == "<");
446
+ },
447
+ IsFilterStartsWith: (value) => {
448
+ return (typeof value == "object" &&
449
+ !PredicateValue.Operations.IsDate(value) &&
450
+ value.kind == "startsWith");
451
+ },
452
+ KindAndValueToFilter: (kind, value) => {
453
+ switch (kind) {
454
+ case "contains":
455
+ return PredicateValue.Default.filterContains(value);
456
+ case "=":
457
+ return PredicateValue.Default.filterEqualsTo(value);
458
+ case "!=":
459
+ return PredicateValue.Default.filterNotEqualsTo(value);
460
+ case ">=":
461
+ return PredicateValue.Default.filterGreaterThanOrEqualsTo(value);
462
+ case ">":
463
+ return PredicateValue.Default.filterGreaterThan(value);
464
+ case "!=null":
465
+ return PredicateValue.Default.filterIsNotNull();
466
+ case "=null":
467
+ return PredicateValue.Default.filterIsNull();
468
+ case "<=":
469
+ return PredicateValue.Default.filterSmallerThanOrEqualsTo(value);
470
+ case "<":
471
+ return PredicateValue.Default.filterSmallerThan(value);
472
+ case "startsWith":
473
+ return PredicateValue.Default.filterStartsWith(value);
474
+ default:
475
+ return PredicateValue.Default.filterEqualsTo(value);
476
+ }
477
+ },
478
+ FilterToKindAndValue: (filter) => {
479
+ switch (filter.kind) {
480
+ case "contains":
481
+ return { kind: "contains", value: filter.contains };
482
+ case "=":
483
+ return { kind: "=", value: filter.equalsTo };
484
+ case "!=":
485
+ return { kind: "!=", value: filter.notEqualsTo };
486
+ case ">=":
487
+ return { kind: ">=", value: filter.greaterThanOrEqualsTo };
488
+ case ">":
489
+ return { kind: ">", value: filter.greaterThan };
490
+ case "!=null":
491
+ return { kind: "!=null", value: PredicateValue.Default.unit() };
492
+ case "=null":
493
+ return { kind: "=null", value: PredicateValue.Default.unit() };
494
+ case "<=":
495
+ return { kind: "<=", value: filter.smallerThanOrEqualsTo };
496
+ case "<":
497
+ return { kind: "<", value: filter.smallerThan };
498
+ default:
499
+ return { kind: "startsWith", value: filter.startsWith };
500
+ }
501
+ },
502
+ ParseAsDate: (json) => {
503
+ if (PredicateValue.Operations.IsDate(json))
504
+ return ValueOrErrors.Default.return(json);
505
+ return ValueOrErrors.Default.throwOne(`date has invalid value property`);
506
+ },
507
+ ParseAsVarLookup: (json) => {
508
+ if (json.kind == "varLookup" && typeof json.varName == "string")
509
+ return ValueOrErrors.Default.return(PredicateValue.Default.varLookup(json.varName));
510
+ return ValueOrErrors.Default.throwOne(`varLookup has invalid varName property`);
511
+ },
512
+ ParseAsUnionCase: (json) => {
513
+ if (typeof json.caseName == "string")
514
+ return ValueOrErrors.Default.return(PredicateValue.Default.unionCase(json.caseName, json.value));
515
+ return ValueOrErrors.Default.throwOne(`union case has invalid caseName property`);
516
+ },
517
+ ParseAsRecord: (json, types) => {
518
+ if ("fields" in json && typeof json.fields == "object") {
519
+ return ValueOrErrors.Operations.All(List(Object.entries(json.fields).map(([fieldName, fieldValue]) => PredicateValue.Operations.parse(fieldValue, { kind: "expression" }, types).Then((value) => ValueOrErrors.Default.return([fieldName, value]))))).Then((entries) => ValueOrErrors.Default.return(PredicateValue.Default.record(OrderedMap(entries))));
520
+ }
521
+ return ValueOrErrors.Default.throwOne(`record has no field property`);
522
+ },
523
+ ParseAsTuple: (json, types) => {
524
+ if (json.values != undefined && Array.isArray(json.values)) {
525
+ return ValueOrErrors.Operations.All(List(json.values.map((elementValue) => PredicateValue.Operations.parse(elementValue, { kind: "expression" }, types)))).Then((values) => ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)));
526
+ }
527
+ return ValueOrErrors.Default.throwOne(`Error: tuple has no values property`);
528
+ },
529
+ // TODO -- do we need to add table here ?
530
+ parse: (json, type, types) => {
531
+ const result = (() => {
532
+ if (type.kind == "expression" &&
533
+ (typeof json == "boolean" ||
534
+ typeof json == "number" ||
535
+ typeof json == "string"))
536
+ return ValueOrErrors.Default.return(json);
537
+ if (type.kind == "expression" && json.kind == undefined) {
538
+ return ValueOrErrors.Default.throwOne(`evaluation statement has no kind value`);
539
+ }
540
+ if (type.kind == "expression" && json.kind == "guid") {
541
+ return ValueOrErrors.Default.return(json);
542
+ }
543
+ if (type.kind == "expression" && json.kind == "date") {
544
+ return PredicateValue.Operations.ParseAsDate(json);
545
+ }
546
+ if (type.kind == "expression" && json.kind == "unit") {
547
+ return ValueOrErrors.Default.return(PredicateValue.Default.unit());
548
+ }
549
+ if (type.kind == "expression" && json.kind == "varLookup") {
550
+ return PredicateValue.Operations.ParseAsVarLookup(json);
551
+ }
552
+ if (type.kind == "expression" &&
553
+ json.kind == "record" &&
554
+ "caseName" in json) {
555
+ return PredicateValue.Operations.ParseAsUnionCase(json);
556
+ }
557
+ if (type.kind == "expression" &&
558
+ json.kind == "record" &&
559
+ "fields" in json) {
560
+ return PredicateValue.Operations.ParseAsRecord(json, types);
561
+ }
562
+ if (type.kind == "expression" &&
563
+ json.kind == "tuple" &&
564
+ "values" in json) {
565
+ return PredicateValue.Operations.ParseAsTuple(json, types);
566
+ }
567
+ if (type.kind == "primitive" && type.value == "Date") {
568
+ if (PredicateValue.Operations.IsDate(json)) {
569
+ return ValueOrErrors.Default.return(json);
570
+ }
571
+ return ValueOrErrors.Default.throwOne(`failed to parse date ${JSON.stringify(json)}`);
572
+ }
573
+ if (type.kind == "primitive" && type.value == "maybeBoolean") {
574
+ return json == undefined
575
+ ? ValueOrErrors.Default.return(false)
576
+ : ValueOrErrors.Default.return(json);
577
+ }
578
+ if (type.kind == "primitive") {
579
+ return ValueOrErrors.Default.return(json);
580
+ }
581
+ if (type.kind == "lookup") {
582
+ const subType = types.get(type.name);
583
+ if (subType == undefined) {
584
+ return ValueOrErrors.Default.throwOne(`cannot find field ${type.name} in types`);
585
+ }
586
+ return PredicateValue.Operations.parse(json, subType, types);
587
+ }
588
+ if (type.kind == "union") {
589
+ const unionCase = type.args.get(json);
590
+ if (unionCase == undefined) {
591
+ return ValueOrErrors.Default.throwOne(`Error: cannot find union case ${JSON.stringify(json)} in types`);
592
+ }
593
+ return PredicateValue.Operations.ParseAsUnionCase({
594
+ kind: "unionCase",
595
+ caseName: json,
596
+ value: { kind: "form", value: Map() },
597
+ });
598
+ }
599
+ if (type.kind == "application" && type.value == "List") {
600
+ return ValueOrErrors.Operations.All(List(json.map((elementValue) => PredicateValue.Operations.parse(elementValue, type.args[0], types)))).Then((values) => ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)));
601
+ }
602
+ if (type.kind == "application" && type.value == "Map") {
603
+ return ValueOrErrors.Operations.All(List(json.map((keyValue) => PredicateValue.Operations.parse(keyValue.key, type.args[0], types).Then((key) => PredicateValue.Operations.parse(keyValue.value, type === null || type === void 0 ? void 0 : type.args[1], types).Then((value) => ValueOrErrors.Default.return(PredicateValue.Default.tuple(List([key, value])))))))).Then((values) => ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)));
604
+ }
605
+ if (type.kind == "application" && type.value == "Sum") {
606
+ return PredicateValue.Operations.parse(json.left, type === null || type === void 0 ? void 0 : type.args[0], types).Then((left) => PredicateValue.Operations.parse(json.right, type === null || type === void 0 ? void 0 : type.args[1], types).Then((right) => ValueOrErrors.Default.return(PredicateValue.Default.tuple(List([left, right])))));
607
+ }
608
+ if (type.kind == "application" && type.value == "SingleSelection") {
609
+ ValueOrErrors.Default.return(PredicateValue.Default.option(json["IsSome"], json["Value"]));
610
+ }
611
+ if (type.kind == "application" && type.value == "MultiSelection") {
612
+ return ValueOrErrors.Operations.All(List(json.map((elementValue) => PredicateValue.Operations.parse(elementValue, type.args[0], types)))).Then((values) => ValueOrErrors.Default.return(PredicateValue.Default.tuple(values)));
613
+ }
614
+ if (type.kind == "record") {
615
+ return ValueOrErrors.Operations.All(List(Object.entries(json).map(([fieldName, fieldValue]) => {
616
+ const subType = type.fields.get(fieldName);
617
+ if (subType == undefined) {
618
+ return ValueOrErrors.Default.throwOne(`cannot find field ${fieldName} in type ${JSON.stringify(type)}`);
619
+ }
620
+ return PredicateValue.Operations.parse(fieldValue, subType, types).Then((value) => ValueOrErrors.Default.return([fieldName, value]));
621
+ }))).Then((entries) => ValueOrErrors.Default.return(PredicateValue.Default.record(OrderedMap(entries.map((_) => [_[0], _[1]])))));
622
+ }
623
+ return ValueOrErrors.Default.throwOne(`unsupported type ${JSON.stringify(type)}`);
624
+ })();
625
+ return result.MapErrors((errors) => errors.map((error) => `${error}\n...When parsing expression ${JSON.stringify(json, null, 2)}`));
626
+ },
627
+ recordToTuple: (r) => {
628
+ const valuesSortedByName = r.fields
629
+ .toSeq()
630
+ .map((v, k) => [k, v])
631
+ .sortBy(([k, v]) => k)
632
+ .map(([k, v]) => v)
633
+ .valueSeq()
634
+ .toArray();
635
+ return PredicateValue.Default.tuple(List(valuesSortedByName));
636
+ },
637
+ Equals: (vars) => (v1, v2) => typeof v1 == "boolean" ||
638
+ typeof v1 == "number" ||
639
+ typeof v1 == "string" ||
640
+ typeof v2 == "boolean" ||
641
+ typeof v2 == "number" ||
642
+ typeof v2 == "string"
643
+ ? typeof v1 == typeof v2
644
+ ? ValueOrErrors.Default.return(v1 == v2)
645
+ : ValueOrErrors.Default.throwOne(`cannot compare expressions of different types ${JSON.stringify(v1)} and ${JSON.stringify(v2)}.`)
646
+ : PredicateValue.Operations.IsDate(v1) &&
647
+ PredicateValue.Operations.IsDate(v2)
648
+ ? v1.getTime() == v2.getTime()
915
649
  ? ValueOrErrors.Default.return(true)
916
- : PredicateValue.Operations.IsUnit(v1) !=
917
- PredicateValue.Operations.IsUnit(v2)
918
- ? ValueOrErrors.Default.throwOne(
919
- `cannot compare expressions of different types ${JSON.stringify(v1)} and ${JSON.stringify(v2)}.`,
920
- )
921
- : ValueOrErrors.Default.throwOne(
922
- `structural equality is not implemented yet between ${JSON.stringify(v1)} and ${JSON.stringify(v2)}.`,
923
- ),
924
- },
650
+ : ValueOrErrors.Default.return(false)
651
+ : PredicateValue.Operations.IsUnionCase(v1) &&
652
+ PredicateValue.Operations.IsUnionCase(v2)
653
+ ? v1.caseName == v2.caseName
654
+ ? PredicateValue.Operations.Equals(vars)(v1.fields, v2.fields)
655
+ : ValueOrErrors.Default.return(false)
656
+ : PredicateValue.Operations.IsTuple(v1) &&
657
+ PredicateValue.Operations.IsTuple(v2)
658
+ ? v1.values.size != v2.values.size
659
+ ? ValueOrErrors.Default.return(false)
660
+ : v1.values.size == 0
661
+ ? ValueOrErrors.Default.return(true)
662
+ : PredicateValue.Operations.Equals(vars)(v1.values.get(0), v2.values.get(0)).Then((firstEqual) => firstEqual
663
+ ? PredicateValue.Operations.Equals(vars)(PredicateValue.Default.tuple(v1.values.slice(1)), PredicateValue.Default.tuple(v2.values.slice(1)))
664
+ : ValueOrErrors.Default.return(false))
665
+ : PredicateValue.Operations.IsRecord(v1) &&
666
+ PredicateValue.Operations.IsRecord(v2)
667
+ ? PredicateValue.Operations.Equals(vars)(PredicateValue.Operations.recordToTuple(v1), PredicateValue.Operations.recordToTuple(v2))
668
+ : PredicateValue.Operations.IsTable(v1) &&
669
+ PredicateValue.Operations.IsTable(v2)
670
+ ? v1.data.size == v2.data.size
671
+ ? ValueOrErrors.Default.return(v1.data.keySeq().equals(v2.data.keySeq()))
672
+ : ValueOrErrors.Default.return(false)
673
+ : PredicateValue.Operations.IsUnit(v1) &&
674
+ PredicateValue.Operations.IsUnit(v2)
675
+ ? ValueOrErrors.Default.return(true)
676
+ : PredicateValue.Operations.IsUnit(v1) !=
677
+ PredicateValue.Operations.IsUnit(v2)
678
+ ? ValueOrErrors.Default.throwOne(`cannot compare expressions of different types ${JSON.stringify(v1)} and ${JSON.stringify(v2)}.`)
679
+ : ValueOrErrors.Default.throwOne(`structural equality is not implemented yet between ${JSON.stringify(v1)} and ${JSON.stringify(v2)}.`),
680
+ },
925
681
  };
926
682
  export const Expr = {
927
- Default: {
928
- prepend: (prependCases, e) => ({
929
- kind: "prepend",
930
- operands: [prependCases, e],
931
- }),
932
- itemLookup: (e, i) => ({
933
- kind: "itemLookup",
934
- operands: [e, i],
935
- }),
936
- fieldLookup: (e, f) => ({
937
- kind: "fieldLookup",
938
- operands: [e, f],
939
- }),
940
- isCase: (e, c) => ({
941
- kind: "isCase",
942
- operands: [e, c],
943
- }),
944
- binaryOperator: (op, e1, e2) => ({
945
- kind: op,
946
- operands: [e1, e2],
947
- }),
948
- matchCase: (operands) => ({
949
- kind: "matchCase",
950
- operands,
951
- }),
952
- lambda: (parameter, body) => ({
953
- kind: "lambda",
954
- parameter,
955
- body,
956
- }),
957
- case: (caseName, handler) => ({
958
- kind: "caseName",
959
- caseName,
960
- handler,
961
- }),
962
- },
963
- Operations: {
964
- IsPrepend: (e) => {
965
- return (
966
- typeof e == "object" &&
967
- !PredicateValue.Operations.IsDate(e) &&
968
- e.kind == "prepend"
969
- );
970
- },
971
- IsItemLookup: (e) => {
972
- return (
973
- typeof e == "object" &&
974
- !PredicateValue.Operations.IsDate(e) &&
975
- e.kind == "itemLookup"
976
- );
977
- },
978
- IsFieldLookup: (e) => {
979
- return (
980
- typeof e == "object" &&
981
- !PredicateValue.Operations.IsDate(e) &&
982
- e.kind == "fieldLookup"
983
- );
984
- },
985
- IsIsCase: (e) => {
986
- return (
987
- typeof e == "object" &&
988
- !PredicateValue.Operations.IsDate(e) &&
989
- e.kind == "isCase"
990
- );
991
- },
992
- IsBinaryOperator: (e) => {
993
- return (
994
- typeof e == "object" &&
995
- !PredicateValue.Operations.IsDate(e) &&
996
- BinaryOperatorsSet.has(e.kind)
997
- );
998
- },
999
- IsCase: (e) => {
1000
- return (
1001
- typeof e == "object" &&
1002
- !PredicateValue.Operations.IsDate(e) &&
1003
- e.kind == "caseName"
1004
- );
1005
- },
1006
- IsCaseArray: (e) => {
1007
- return e.every((e) => Expr.Operations.IsCase(e));
1008
- },
1009
- AsCaseArray: (e) => {
1010
- return e.every((e) => Expr.Operations.IsCase(e))
1011
- ? ValueOrErrors.Default.return(e)
1012
- : ValueOrErrors.Default.throwOne(
1013
- `Error: expected cases, got ${JSON.stringify(e)}`,
1014
- );
1015
- },
1016
- IsMatchCase: (e) => {
1017
- return (
1018
- typeof e == "object" &&
1019
- !PredicateValue.Operations.IsDate(e) &&
1020
- e.kind == "matchCase"
1021
- );
1022
- },
1023
- IsLambda: (e) => {
1024
- return (
1025
- typeof e == "object" &&
1026
- !PredicateValue.Operations.IsDate(e) &&
1027
- e.kind == "lambda"
1028
- );
1029
- },
1030
- parseAsVisibilityExpression: (json) =>
1031
- Expr.Operations.parse(json).MapErrors((errors) =>
1032
- errors.map(
1033
- (error) => `${error}\n...When parsing visibility expression`,
1034
- ),
1035
- ),
1036
- parseAsDisabledExpression: (json) =>
1037
- Expr.Operations.parse(json).MapErrors((errors) =>
1038
- errors.map((error) => `${error}\n...When parsing disabled expression`),
1039
- ),
1040
- parse: (json) => {
1041
- const asValue = PredicateValue.Operations.parse(
1042
- json,
1043
- { kind: "expression" },
1044
- Map(),
1045
- );
1046
- if (asValue.kind == "value") return asValue;
1047
- if (Expr.Operations.IsItemLookup(json)) {
1048
- const [first, second] = json["operands"];
1049
- return Expr.Operations.parse(first).Then((first) =>
1050
- ValueOrErrors.Default.return(
1051
- // Tuples are 1-indexed
1052
- Expr.Default.itemLookup(first, second - 1),
1053
- ),
1054
- );
1055
- }
1056
- if (Expr.Operations.IsFieldLookup(json)) {
1057
- const [first, second] = json["operands"];
1058
- return Expr.Operations.parse(first).Then((first) =>
1059
- ValueOrErrors.Default.return(Expr.Default.fieldLookup(first, second)),
1060
- );
1061
- }
1062
- if (Expr.Operations.IsIsCase(json)) {
1063
- const [first, second] = json["operands"];
1064
- return Expr.Operations.parse(first).Then((first) =>
1065
- ValueOrErrors.Default.return(Expr.Default.isCase(first, second)),
1066
- );
1067
- }
1068
- if (Expr.Operations.IsBinaryOperator(json)) {
1069
- const [first, second] = json["operands"];
1070
- if (BinaryOperatorsSet.contains(json["kind"])) {
1071
- return Expr.Operations.parse(first).Then((first) =>
1072
- Expr.Operations.parse(second).Then((second) =>
1073
- ValueOrErrors.Default.return(
1074
- Expr.Default.binaryOperator(json["kind"], first, second),
1075
- ),
1076
- ),
1077
- );
1078
- }
1079
- }
1080
- if (Expr.Operations.IsMatchCase(json)) {
1081
- return ValueOrErrors.Operations.All(
1082
- List(
1083
- json["operands"].map((operand) => Expr.Operations.parse(operand)),
1084
- ),
1085
- ).Then((operands) =>
1086
- ValueOrErrors.Default.return(
1087
- Expr.Default.matchCase(operands.toArray()),
1088
- ),
1089
- );
1090
- }
1091
- if (Expr.Operations.IsLambda(json)) {
1092
- return Expr.Operations.parse(json["body"]).Then((body) =>
1093
- ValueOrErrors.Default.return(
1094
- Expr.Default.lambda(json["parameter"], body),
1095
- ),
1096
- );
1097
- }
1098
- if (Expr.Operations.IsCase(json)) {
1099
- return Expr.Operations.parse(json["handler"]).Then((handler) =>
1100
- Expr.Operations.IsLambda(handler)
1101
- ? ValueOrErrors.Default.return(
1102
- Expr.Default.case(json["caseName"], handler),
1103
- )
1104
- : ValueOrErrors.Default.throwOne(
1105
- `expected lambda expression, got ${JSON.stringify(handler)}`,
1106
- ),
1107
- );
1108
- }
1109
- if (Expr.Operations.IsPrepend(json)) {
1110
- const [casesToPrepend, expr] = json["operands"];
1111
- return Expr.Operations.parse(expr).Then((expr) =>
1112
- ValueOrErrors.Default.return(
1113
- Expr.Default.prepend(casesToPrepend, expr),
1114
- ),
1115
- );
1116
- }
1117
- return ValueOrErrors.Default.throwOne(
1118
- `cannot parse ${JSON.stringify(json)} to Expr.`,
1119
- );
1120
- },
1121
- EvaluateAsTuple: (vars) => (e) =>
1122
- !PredicateValue.Operations.IsTuple(e)
1123
- ? ValueOrErrors.Default.throwOne(
1124
- `expected tuple expression, got ${JSON.stringify(e)}`,
1125
- )
1126
- : ValueOrErrors.Default.return(e),
1127
- EvaluateAsRecord: (vars) => (e) =>
1128
- !PredicateValue.Operations.IsRecord(e)
1129
- ? ValueOrErrors.Default.throwOne(
1130
- `expected record expression, got ${JSON.stringify(e)}`,
1131
- )
1132
- : ValueOrErrors.Default.return(e),
1133
- EvaluateAsUnionCase: (vars) => (e) =>
1134
- !PredicateValue.Operations.IsUnionCase(e)
1135
- ? ValueOrErrors.Default.throwOne(
1136
- `expected union case expression, got ${JSON.stringify(e)}`,
1137
- )
1138
- : ValueOrErrors.Default.return(e),
1139
- EvaluateAsBoolean: (vars) => (e) =>
1140
- !PredicateValue.Operations.IsBoolean(e)
1141
- ? ValueOrErrors.Default.throwOne(
1142
- `expected boolean expression, got ${JSON.stringify(e)}`,
1143
- )
1144
- : ValueOrErrors.Default.return(e),
1145
- MatchCase: (vars) => (e, cases) =>
1146
- Expr.Operations.Evaluate(vars)(e).Then((matchable) =>
1147
- PredicateValue.Operations.IsSum(matchable)
1148
- ? matchable.value.kind == "l"
1149
- ? MapRepo.Operations.tryFindWithError(
1150
- "Sum.Left",
1151
- cases,
1152
- () => `cannot find match case Sum.Left`,
1153
- ).Then((leftCaseHandler) =>
1154
- Expr.Operations.Evaluate(
1155
- vars.set(leftCaseHandler.parameter, matchable.value.value),
1156
- )(leftCaseHandler),
1157
- )
1158
- : MapRepo.Operations.tryFindWithError(
1159
- "Sum.Right",
1160
- cases,
1161
- () => `cannot find match case Sum.Right`,
1162
- ).Then((rightCaseHandler) =>
1163
- Expr.Operations.Evaluate(
1164
- vars.set(rightCaseHandler.parameter, matchable.value.value),
1165
- )(rightCaseHandler),
1166
- )
1167
- : PredicateValue.Operations.IsUnionCase(matchable)
1168
- ? MapRepo.Operations.tryFindWithError(
1169
- matchable.caseName,
1170
- cases,
1171
- () => `cannot find match case ${matchable.caseName}`,
1172
- ).Then((matchedCaseHandler) =>
1173
- Expr.Operations.Evaluate(
1174
- vars.set(matchedCaseHandler.parameter, matchable.fields),
1175
- )(matchedCaseHandler),
1176
- )
1177
- : ValueOrErrors.Default.throwOne(
1178
- `unsupported matchable type in MatchCase: ${JSON.stringify(matchable)}`,
1179
- ),
1180
- ),
1181
- ComputePredicateEvaluation: (vars) => (expr) => {
1182
- if (typeof expr == "boolean") {
1183
- return ValueOrErrors.Default.return(expr);
1184
- }
1185
- return Expr.Operations.Evaluate(vars)(expr).Then((result) => {
1186
- if (typeof result == "boolean") {
1187
- return ValueOrErrors.Default.return(result);
1188
- }
1189
- return ValueOrErrors.Default.throwOne(
1190
- `Error: cannot evaluate expression ${JSON.stringify(expr)} to a boolean`,
1191
- );
1192
- });
1193
- },
1194
- EvaluateAs: (as) => (vars) => (e) => {
1195
- return Expr.Operations.Evaluate(vars)(e).MapErrors((errors) =>
1196
- errors.map(
1197
- (error) =>
1198
- `${error}\n...When evaluating expression ${JSON.stringify(e)} as ${as}`,
1199
- ),
1200
- );
683
+ Default: {
684
+ prepend: (prependCases, e) => ({
685
+ kind: "prepend",
686
+ operands: [prependCases, e],
687
+ }),
688
+ itemLookup: (e, i) => ({
689
+ kind: "itemLookup",
690
+ operands: [e, i],
691
+ }),
692
+ fieldLookup: (e, f) => ({
693
+ kind: "fieldLookup",
694
+ operands: [e, f],
695
+ }),
696
+ isCase: (e, c) => ({
697
+ kind: "isCase",
698
+ operands: [e, c],
699
+ }),
700
+ binaryOperator: (op, e1, e2) => ({
701
+ kind: op,
702
+ operands: [e1, e2],
703
+ }),
704
+ matchCase: (operands) => ({
705
+ kind: "matchCase",
706
+ operands,
707
+ }),
708
+ lambda: (parameter, body) => ({
709
+ kind: "lambda",
710
+ parameter,
711
+ body,
712
+ }),
713
+ case: (caseName, handler) => ({
714
+ kind: "caseName",
715
+ caseName,
716
+ handler,
717
+ }),
1201
718
  },
1202
- Evaluate: (vars) => (e) => {
1203
- const result = (() => {
1204
- return PredicateValue.Operations.IsBoolean(e) ||
1205
- PredicateValue.Operations.IsNumber(e) ||
1206
- PredicateValue.Operations.IsString(e) ||
1207
- PredicateValue.Operations.IsUnit(e) ||
1208
- PredicateValue.Operations.IsRecord(e) ||
1209
- PredicateValue.Operations.IsTuple(e) ||
1210
- PredicateValue.Operations.IsUnionCase(e) ||
1211
- PredicateValue.Operations.IsSum(e)
1212
- ? ValueOrErrors.Default.return(e)
1213
- : PredicateValue.Operations.IsVarLookup(e)
1214
- ? MapRepo.Operations.tryFindWithError(
1215
- e.varName,
1216
- vars,
1217
- () =>
1218
- `Error: cannot find variable ${JSON.stringify(e.varName)}`,
1219
- )
1220
- : Expr.Operations.IsItemLookup(e)
1221
- ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then(
1222
- (maybeTuple) =>
1223
- Expr.Operations.EvaluateAsTuple(vars)(maybeTuple).Then(
1224
- (tuple) =>
1225
- ListRepo.Operations.tryFindWithError(
1226
- e.operands[1],
1227
- tuple.values,
1228
- () =>
1229
- `Error: cannot find element of index ${e.operands[1]} in tuple ${JSON.stringify(tuple)}`,
1230
- ),
1231
- ),
1232
- )
1233
- : Expr.Operations.IsFieldLookup(e)
1234
- ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then(
1235
- (maybeRecord) =>
1236
- Expr.Operations.EvaluateAsRecord(vars)(maybeRecord).Then(
1237
- (record) =>
1238
- MapRepo.Operations.tryFindWithError(
1239
- e.operands[1],
1240
- record.fields,
1241
- () => `Error: cannot find field ${e.operands[1]}`,
1242
- ),
1243
- ),
1244
- )
1245
- : Expr.Operations.IsIsCase(e)
1246
- ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then(
1247
- (maybeUnionCase) =>
1248
- Expr.Operations.EvaluateAsUnionCase(vars)(
1249
- maybeUnionCase,
1250
- ).Then((unionCase) =>
1251
- ValueOrErrors.Default.return(
1252
- unionCase.caseName == e.operands[1],
1253
- ),
1254
- ),
1255
- )
1256
- : Expr.Operations.IsMatchCase(e)
1257
- ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then(
1258
- (matchable) =>
1259
- Expr.Operations.AsCaseArray(e.operands.slice(1)).Then(
1260
- (cases) =>
1261
- Expr.Operations.MatchCase(vars)(
1262
- matchable,
1263
- Map(cases.map((c) => [c.caseName, c.handler])),
1264
- ),
1265
- ),
1266
- )
1267
- : Expr.Operations.IsLambda(e)
1268
- ? Expr.Operations.Evaluate(vars)(e.body)
1269
- : Expr.Operations.IsBinaryOperator(e) &&
1270
- e.kind == "equals"
1271
- ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then(
1272
- (v1) =>
1273
- Expr.Operations.Evaluate(vars)(
1274
- e.operands[1],
1275
- ).Then((v2) =>
1276
- PredicateValue.Operations.Equals(vars)(
1277
- v1,
1278
- v2,
1279
- ).Then((eq) =>
1280
- ValueOrErrors.Default.return(eq),
1281
- ),
1282
- ),
1283
- )
1284
- : Expr.Operations.IsBinaryOperator(e) && e.kind == "or"
1285
- ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then(
1286
- (v1) =>
1287
- Expr.Operations.Evaluate(vars)(
1288
- e.operands[1],
1289
- ).Then((v2) =>
1290
- Expr.Operations.EvaluateAsBoolean(vars)(
1291
- v1,
1292
- ).Then((v1) =>
1293
- Expr.Operations.EvaluateAsBoolean(vars)(
1294
- v2,
1295
- ).Then((v2) =>
1296
- ValueOrErrors.Default.return(v1 || v2),
1297
- ),
1298
- ),
1299
- ),
1300
- )
1301
- : Expr.Operations.IsPrepend(e)
1302
- ? Expr.Operations.Evaluate(vars)(
1303
- e.operands[1],
1304
- ).Then((v) =>
1305
- Expr.Operations.EvaluateAsRecord(vars)(v).Then(
1306
- (v) => {
1307
- const prependEntries = e.operands[0].map(
1308
- (c) => [
1309
- c,
1310
- PredicateValue.Default.record(
1311
- OrderedMap([["Value", c]]),
1312
- ),
1313
- ],
1314
- );
1315
- const existingEntries = Array.from(
1316
- v.fields.entries(),
1317
- );
1318
- let returnValue =
1319
- PredicateValue.Default.record(
1320
- OrderedMap(
1321
- prependEntries.concat(
1322
- existingEntries,
1323
- ),
1324
- ),
1325
- );
1326
- return ValueOrErrors.Default.return(
1327
- returnValue,
1328
- );
1329
- },
1330
- ),
1331
- )
1332
- : ValueOrErrors.Default.throwOne(
1333
- `Error: unsupported expression ${JSON.stringify(e)}`,
1334
- );
1335
- })();
1336
- return result.MapErrors((errors) =>
1337
- errors.map(
1338
- (error) =>
1339
- `${error}\n...When evaluating expression ${JSON.stringify(e, null, 2)}`,
1340
- ),
1341
- );
719
+ Operations: {
720
+ IsPrepend: (e) => {
721
+ return (typeof e == "object" &&
722
+ !PredicateValue.Operations.IsDate(e) &&
723
+ e.kind == "prepend");
724
+ },
725
+ IsItemLookup: (e) => {
726
+ return (typeof e == "object" &&
727
+ !PredicateValue.Operations.IsDate(e) &&
728
+ e.kind == "itemLookup");
729
+ },
730
+ IsFieldLookup: (e) => {
731
+ return (typeof e == "object" &&
732
+ !PredicateValue.Operations.IsDate(e) &&
733
+ e.kind == "fieldLookup");
734
+ },
735
+ IsIsCase: (e) => {
736
+ return (typeof e == "object" &&
737
+ !PredicateValue.Operations.IsDate(e) &&
738
+ e.kind == "isCase");
739
+ },
740
+ IsBinaryOperator: (e) => {
741
+ return (typeof e == "object" &&
742
+ !PredicateValue.Operations.IsDate(e) &&
743
+ BinaryOperatorsSet.has(e.kind));
744
+ },
745
+ IsCase: (e) => {
746
+ return (typeof e == "object" &&
747
+ !PredicateValue.Operations.IsDate(e) &&
748
+ e.kind == "caseName");
749
+ },
750
+ IsCaseArray: (e) => {
751
+ return e.every((e) => Expr.Operations.IsCase(e));
752
+ },
753
+ AsCaseArray: (e) => {
754
+ return e.every((e) => Expr.Operations.IsCase(e))
755
+ ? ValueOrErrors.Default.return(e)
756
+ : ValueOrErrors.Default.throwOne(`Error: expected cases, got ${JSON.stringify(e)}`);
757
+ },
758
+ IsMatchCase: (e) => {
759
+ return (typeof e == "object" &&
760
+ !PredicateValue.Operations.IsDate(e) &&
761
+ e.kind == "matchCase");
762
+ },
763
+ IsLambda: (e) => {
764
+ return (typeof e == "object" &&
765
+ !PredicateValue.Operations.IsDate(e) &&
766
+ e.kind == "lambda");
767
+ },
768
+ parseAsVisibilityExpression: (json) => Expr.Operations.parse(json).MapErrors((errors) => errors.map((error) => `${error}\n...When parsing visibility expression`)),
769
+ parseAsDisabledExpression: (json) => Expr.Operations.parse(json).MapErrors((errors) => errors.map((error) => `${error}\n...When parsing disabled expression`)),
770
+ parse: (json) => {
771
+ const asValue = PredicateValue.Operations.parse(json, { kind: "expression" }, Map());
772
+ if (asValue.kind == "value")
773
+ return asValue;
774
+ if (Expr.Operations.IsItemLookup(json)) {
775
+ const [first, second] = json["operands"];
776
+ return Expr.Operations.parse(first).Then((first) => ValueOrErrors.Default.return(
777
+ // Tuples are 1-indexed
778
+ Expr.Default.itemLookup(first, second - 1)));
779
+ }
780
+ if (Expr.Operations.IsFieldLookup(json)) {
781
+ const [first, second] = json["operands"];
782
+ return Expr.Operations.parse(first).Then((first) => ValueOrErrors.Default.return(Expr.Default.fieldLookup(first, second)));
783
+ }
784
+ if (Expr.Operations.IsIsCase(json)) {
785
+ const [first, second] = json["operands"];
786
+ return Expr.Operations.parse(first).Then((first) => ValueOrErrors.Default.return(Expr.Default.isCase(first, second)));
787
+ }
788
+ if (Expr.Operations.IsBinaryOperator(json)) {
789
+ const [first, second] = json["operands"];
790
+ if (BinaryOperatorsSet.contains(json["kind"])) {
791
+ return Expr.Operations.parse(first).Then((first) => Expr.Operations.parse(second).Then((second) => ValueOrErrors.Default.return(Expr.Default.binaryOperator(json["kind"], first, second))));
792
+ }
793
+ }
794
+ if (Expr.Operations.IsMatchCase(json)) {
795
+ return ValueOrErrors.Operations.All(List(json["operands"].map((operand) => Expr.Operations.parse(operand)))).Then((operands) => ValueOrErrors.Default.return(Expr.Default.matchCase(operands.toArray())));
796
+ }
797
+ if (Expr.Operations.IsLambda(json)) {
798
+ return Expr.Operations.parse(json["body"]).Then((body) => ValueOrErrors.Default.return(Expr.Default.lambda(json["parameter"], body)));
799
+ }
800
+ if (Expr.Operations.IsCase(json)) {
801
+ return Expr.Operations.parse(json["handler"]).Then((handler) => Expr.Operations.IsLambda(handler)
802
+ ? ValueOrErrors.Default.return(Expr.Default.case(json["caseName"], handler))
803
+ : ValueOrErrors.Default.throwOne(`expected lambda expression, got ${JSON.stringify(handler)}`));
804
+ }
805
+ if (Expr.Operations.IsPrepend(json)) {
806
+ const [casesToPrepend, expr] = json["operands"];
807
+ return Expr.Operations.parse(expr).Then((expr) => ValueOrErrors.Default.return(Expr.Default.prepend(casesToPrepend, expr)));
808
+ }
809
+ return ValueOrErrors.Default.throwOne(`cannot parse ${JSON.stringify(json)} to Expr.`);
810
+ },
811
+ EvaluateAsTuple: (vars) => (e) => !PredicateValue.Operations.IsTuple(e)
812
+ ? ValueOrErrors.Default.throwOne(`expected tuple expression, got ${JSON.stringify(e)}`)
813
+ : ValueOrErrors.Default.return(e),
814
+ EvaluateAsRecord: (vars) => (e) => !PredicateValue.Operations.IsRecord(e)
815
+ ? ValueOrErrors.Default.throwOne(`expected record expression, got ${JSON.stringify(e)}`)
816
+ : ValueOrErrors.Default.return(e),
817
+ EvaluateAsUnionCase: (vars) => (e) => !PredicateValue.Operations.IsUnionCase(e)
818
+ ? ValueOrErrors.Default.throwOne(`expected union case expression, got ${JSON.stringify(e)}`)
819
+ : ValueOrErrors.Default.return(e),
820
+ EvaluateAsBoolean: (vars) => (e) => !PredicateValue.Operations.IsBoolean(e)
821
+ ? ValueOrErrors.Default.throwOne(`expected boolean expression, got ${JSON.stringify(e)}`)
822
+ : ValueOrErrors.Default.return(e),
823
+ MatchCase: (vars) => (e, cases) => Expr.Operations.Evaluate(vars)(e).Then((matchable) => PredicateValue.Operations.IsSum(matchable)
824
+ ? matchable.value.kind == "l"
825
+ ? MapRepo.Operations.tryFindWithError("Sum.Left", cases, () => `cannot find match case Sum.Left`).Then((leftCaseHandler) => Expr.Operations.Evaluate(vars.set(leftCaseHandler.parameter, matchable.value.value))(leftCaseHandler))
826
+ : MapRepo.Operations.tryFindWithError("Sum.Right", cases, () => `cannot find match case Sum.Right`).Then((rightCaseHandler) => Expr.Operations.Evaluate(vars.set(rightCaseHandler.parameter, matchable.value.value))(rightCaseHandler))
827
+ : PredicateValue.Operations.IsUnionCase(matchable)
828
+ ? MapRepo.Operations.tryFindWithError(matchable.caseName, cases, () => `cannot find match case ${matchable.caseName}`).Then((matchedCaseHandler) => Expr.Operations.Evaluate(vars.set(matchedCaseHandler.parameter, matchable.fields))(matchedCaseHandler))
829
+ : ValueOrErrors.Default.throwOne(`unsupported matchable type in MatchCase: ${JSON.stringify(matchable)}`)),
830
+ ComputePredicateEvaluation: (vars) => (expr) => {
831
+ if (typeof expr == "boolean") {
832
+ return ValueOrErrors.Default.return(expr);
833
+ }
834
+ return Expr.Operations.Evaluate(vars)(expr).Then((result) => {
835
+ if (typeof result == "boolean") {
836
+ return ValueOrErrors.Default.return(result);
837
+ }
838
+ return ValueOrErrors.Default.throwOne(`Error: cannot evaluate expression ${JSON.stringify(expr)} to a boolean`);
839
+ });
840
+ },
841
+ EvaluateAs: (as) => (vars) => (e) => {
842
+ return Expr.Operations.Evaluate(vars)(e).MapErrors((errors) => errors.map((error) => `${error}\n...When evaluating expression ${JSON.stringify(e)} as ${as}`));
843
+ },
844
+ Evaluate: (vars) => (e) => {
845
+ const result = (() => {
846
+ return PredicateValue.Operations.IsBoolean(e) ||
847
+ PredicateValue.Operations.IsNumber(e) ||
848
+ PredicateValue.Operations.IsString(e) ||
849
+ PredicateValue.Operations.IsUnit(e) ||
850
+ PredicateValue.Operations.IsRecord(e) ||
851
+ PredicateValue.Operations.IsTuple(e) ||
852
+ PredicateValue.Operations.IsUnionCase(e) ||
853
+ PredicateValue.Operations.IsSum(e)
854
+ ? ValueOrErrors.Default.return(e)
855
+ : PredicateValue.Operations.IsVarLookup(e)
856
+ ? MapRepo.Operations.tryFindWithError(e.varName, vars, () => `Error: cannot find variable ${JSON.stringify(e.varName)}`)
857
+ : Expr.Operations.IsItemLookup(e)
858
+ ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then((maybeTuple) => Expr.Operations.EvaluateAsTuple(vars)(maybeTuple).Then((tuple) => ListRepo.Operations.tryFindWithError(e.operands[1], tuple.values, () => `Error: cannot find element of index ${e.operands[1]} in tuple ${JSON.stringify(tuple)}`)))
859
+ : Expr.Operations.IsFieldLookup(e)
860
+ ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then((maybeRecord) => Expr.Operations.EvaluateAsRecord(vars)(maybeRecord).Then((record) => MapRepo.Operations.tryFindWithError(e.operands[1], record.fields, () => `Error: cannot find field ${e.operands[1]}`)))
861
+ : Expr.Operations.IsIsCase(e)
862
+ ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then((maybeUnionCase) => Expr.Operations.EvaluateAsUnionCase(vars)(maybeUnionCase).Then((unionCase) => ValueOrErrors.Default.return(unionCase.caseName == e.operands[1])))
863
+ : Expr.Operations.IsMatchCase(e)
864
+ ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then((matchable) => Expr.Operations.AsCaseArray(e.operands.slice(1)).Then((cases) => Expr.Operations.MatchCase(vars)(matchable, Map(cases.map((c) => [c.caseName, c.handler])))))
865
+ : Expr.Operations.IsLambda(e)
866
+ ? Expr.Operations.Evaluate(vars)(e.body)
867
+ : Expr.Operations.IsBinaryOperator(e) &&
868
+ e.kind == "equals"
869
+ ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then((v1) => Expr.Operations.Evaluate(vars)(e.operands[1]).Then((v2) => PredicateValue.Operations.Equals(vars)(v1, v2).Then((eq) => ValueOrErrors.Default.return(eq))))
870
+ : Expr.Operations.IsBinaryOperator(e) &&
871
+ e.kind == "or"
872
+ ? Expr.Operations.Evaluate(vars)(e.operands[0]).Then((v1) => Expr.Operations.Evaluate(vars)(e.operands[1]).Then((v2) => Expr.Operations.EvaluateAsBoolean(vars)(v1).Then((v1) => Expr.Operations.EvaluateAsBoolean(vars)(v2).Then((v2) => ValueOrErrors.Default.return(v1 || v2)))))
873
+ : Expr.Operations.IsPrepend(e)
874
+ ? Expr.Operations.Evaluate(vars)(e.operands[1]).Then((v) => Expr.Operations.EvaluateAsRecord(vars)(v).Then((v) => {
875
+ const prependEntries = e.operands[0].map((c) => [
876
+ c,
877
+ PredicateValue.Default.record(OrderedMap([["Value", c]])),
878
+ ]);
879
+ const existingEntries = Array.from(v.fields.entries());
880
+ let returnValue = PredicateValue.Default.record(OrderedMap(prependEntries.concat(existingEntries)));
881
+ return ValueOrErrors.Default.return(returnValue);
882
+ }))
883
+ : ValueOrErrors.Default.throwOne(`Error: unsupported expression ${JSON.stringify(e)}`);
884
+ })();
885
+ return result.MapErrors((errors) => errors.map((error) => `${error}\n...When evaluating expression ${JSON.stringify(e, null, 2)}`));
886
+ },
1342
887
  },
1343
- },
1344
888
  };
1345
889
  export const evaluatePredicates = (context, root) => {
1346
- const bindings = Map()
1347
- .set("global", context.global)
1348
- .set("root", root)
1349
- .set("local", root);
1350
- const traverse = (bindings, predicate, raw) => {
1351
- if (predicate.kind == "primitive") {
1352
- return calculateVisibility(predicate.value, bindings).Then((result) => {
1353
- return ValueOrErrors.Default.return({
1354
- kind: "primitive",
1355
- value: result,
1356
- });
1357
- });
1358
- }
1359
- if (predicate.kind == "record") {
1360
- if (typeof raw != "object" || !("kind" in raw) || raw.kind != "record") {
1361
- return ValueOrErrors.Default.throwOne(
1362
- `parsing expected record in raw, got ${JSON.stringify(raw)}`,
1363
- );
1364
- }
1365
- return calculateVisibility(predicate.value, bindings).Then((result) =>
1366
- ValueOrErrors.Operations.All(
1367
- List(
1368
- predicate.fields.entrySeq().map(([fieldName, fieldPredicate]) => {
1369
- const fieldRaw = raw.fields.get(fieldName);
1370
- if (fieldRaw == undefined) {
1371
- return ValueOrErrors.Default.return([
1372
- fieldName,
1373
- { kind: "primitive", value: false },
1374
- ]);
1375
- }
1376
- if (fieldPredicate.kind == "record") {
1377
- const localBindings = bindings.get("local");
1378
- const fieldLocal = localBindings.fields.get(fieldName);
1379
- if (fieldLocal == undefined) {
1380
- return ValueOrErrors.Default.throwOne(
1381
- `Error: parsing cannot find field ${fieldName} in local ${JSON.stringify(localBindings)}`,
1382
- );
890
+ const bindings = Map()
891
+ .set("global", context.global)
892
+ .set("root", root)
893
+ .set("local", root);
894
+ const traverse = (bindings, predicate, raw) => {
895
+ if (predicate.kind == "primitive") {
896
+ return calculateVisibility(predicate.value, bindings).Then((result) => {
897
+ return ValueOrErrors.Default.return({
898
+ kind: "primitive",
899
+ value: result,
900
+ });
901
+ });
902
+ }
903
+ if (predicate.kind == "record") {
904
+ if (typeof raw != "object" || !("kind" in raw) || raw.kind != "record") {
905
+ return ValueOrErrors.Default.throwOne(`parsing expected record in raw, got ${JSON.stringify(raw)}`);
906
+ }
907
+ return calculateVisibility(predicate.value, bindings).Then((result) => ValueOrErrors.Operations.All(List(predicate.fields
908
+ .entrySeq()
909
+ .map(([fieldName, fieldPredicate]) => {
910
+ const fieldRaw = raw.fields.get(fieldName);
911
+ if (fieldRaw == undefined) {
912
+ return ValueOrErrors.Default.return([
913
+ fieldName,
914
+ { kind: "primitive", value: false },
915
+ ]);
1383
916
  }
1384
- const fieldBindings = bindings.set("local", fieldLocal);
1385
- return traverse(fieldBindings, fieldPredicate, fieldRaw).Then(
1386
- (evaluation) =>
1387
- ValueOrErrors.Default.return([fieldName, evaluation]),
1388
- );
1389
- }
1390
- return traverse(bindings, fieldPredicate, fieldRaw).Then(
1391
- (evaluation) =>
1392
- ValueOrErrors.Default.return([fieldName, evaluation]),
1393
- );
1394
- }),
1395
- ),
1396
- ).Then((evaluations) => {
1397
- return ValueOrErrors.Default.return({
1398
- kind: "form",
1399
- value: result,
1400
- fields: Map(evaluations.map((_) => [_[0], _[1]])),
1401
- });
1402
- }),
1403
- );
1404
- }
1405
- if (predicate.kind == "list") {
1406
- return calculateVisibility(predicate.value, bindings).Then((result) => {
1407
- if (PredicateValue.Operations.IsTuple(raw)) {
1408
- return ValueOrErrors.Operations.All(
1409
- List(
1410
- raw.values.map((value, index) => {
1411
- const elementLocal = raw.values.get(index);
1412
- if (elementLocal == undefined) {
1413
- return ValueOrErrors.Default.throwOne(
1414
- `Error: cannot find element of index ${index} in local ${JSON.stringify(raw)}`,
1415
- );
917
+ if (fieldPredicate.kind == "record") {
918
+ const localBindings = bindings.get("local");
919
+ const fieldLocal = localBindings.fields.get(fieldName);
920
+ if (fieldLocal == undefined) {
921
+ return ValueOrErrors.Default.throwOne(`Error: parsing cannot find field ${fieldName} in local ${JSON.stringify(localBindings)}`);
922
+ }
923
+ const fieldBindings = bindings.set("local", fieldLocal);
924
+ return traverse(fieldBindings, fieldPredicate, fieldRaw).Then((evaluation) => ValueOrErrors.Default.return([fieldName, evaluation]));
1416
925
  }
1417
- const elementBindings = bindings.set("local", elementLocal);
1418
- return traverse(
1419
- elementBindings,
1420
- predicate.elementExpression,
1421
- value,
1422
- );
1423
- }),
1424
- ),
1425
- ).Then((elementResults) => {
1426
- return ValueOrErrors.Default.return({
1427
- kind: "list",
1428
- value: result,
1429
- elementValues: elementResults.toArray(),
926
+ return traverse(bindings, fieldPredicate, fieldRaw).Then((evaluation) => ValueOrErrors.Default.return([fieldName, evaluation]));
927
+ }))).Then((evaluations) => {
928
+ return ValueOrErrors.Default.return({
929
+ kind: "form",
930
+ value: result,
931
+ fields: Map(evaluations.map((_) => [_[0], _[1]])),
932
+ });
933
+ }));
934
+ }
935
+ if (predicate.kind == "list") {
936
+ return calculateVisibility(predicate.value, bindings).Then((result) => {
937
+ if (PredicateValue.Operations.IsTuple(raw)) {
938
+ return ValueOrErrors.Operations.All(List(raw.values.map((value, index) => {
939
+ const elementLocal = raw.values.get(index);
940
+ if (elementLocal == undefined) {
941
+ return ValueOrErrors.Default.throwOne(`Error: cannot find element of index ${index} in local ${JSON.stringify(raw)}`);
942
+ }
943
+ const elementBindings = bindings.set("local", elementLocal);
944
+ return traverse(elementBindings, predicate.elementExpression, value);
945
+ }))).Then((elementResults) => {
946
+ return ValueOrErrors.Default.return({
947
+ kind: "list",
948
+ value: result,
949
+ elementValues: elementResults.toArray(),
950
+ });
951
+ });
952
+ }
953
+ return ValueOrErrors.Default.throwOne(`Error: parsing expected tuple, got ${JSON.stringify(raw)}`);
1430
954
  });
1431
- });
1432
955
  }
1433
- return ValueOrErrors.Default.throwOne(
1434
- `Error: parsing expected tuple, got ${JSON.stringify(raw)}`,
1435
- );
1436
- });
1437
- }
1438
- if (predicate.kind == "map") {
1439
- return calculateVisibility(predicate.value, bindings).Then((result) => {
1440
- if (typeof raw == "object" && "kind" in raw && raw.kind == "tuple") {
1441
- return ValueOrErrors.Operations.All(
1442
- List(
1443
- raw.values.map((kv) => {
1444
- if (PredicateValue.Operations.IsTuple(kv)) {
1445
- const keyLocal = kv.values.get(0);
1446
- const valueLocal = kv.values.get(1);
1447
- if (keyLocal == undefined || valueLocal == undefined) {
1448
- return ValueOrErrors.Default.throwOne(
1449
- `Error: cannot find key or value of ${JSON.stringify(kv)} in local ${JSON.stringify(raw)}`,
1450
- );
1451
- }
1452
- const keyBindings = bindings.set("local", keyLocal);
1453
- const valueBindings = bindings.set("local", valueLocal);
1454
- return traverse(
1455
- keyBindings,
1456
- predicate.keyExpression,
1457
- keyLocal,
1458
- ).Then((keyResult) => {
1459
- return traverse(
1460
- valueBindings,
1461
- predicate.valueExpression,
1462
- valueLocal,
1463
- ).Then((valueResult) => {
1464
- return ValueOrErrors.Default.return({
1465
- key: keyResult,
1466
- value: valueResult,
1467
- });
956
+ if (predicate.kind == "map") {
957
+ return calculateVisibility(predicate.value, bindings).Then((result) => {
958
+ if (typeof raw == "object" && "kind" in raw && raw.kind == "tuple") {
959
+ return ValueOrErrors.Operations.All(List(raw.values.map((kv) => {
960
+ if (PredicateValue.Operations.IsTuple(kv)) {
961
+ const keyLocal = kv.values.get(0);
962
+ const valueLocal = kv.values.get(1);
963
+ if (keyLocal == undefined || valueLocal == undefined) {
964
+ return ValueOrErrors.Default.throwOne(`Error: cannot find key or value of ${JSON.stringify(kv)} in local ${JSON.stringify(raw)}`);
965
+ }
966
+ const keyBindings = bindings.set("local", keyLocal);
967
+ const valueBindings = bindings.set("local", valueLocal);
968
+ return traverse(keyBindings, predicate.keyExpression, keyLocal).Then((keyResult) => {
969
+ return traverse(valueBindings, predicate.valueExpression, valueLocal).Then((valueResult) => {
970
+ return ValueOrErrors.Default.return({
971
+ key: keyResult,
972
+ value: valueResult,
973
+ });
974
+ });
975
+ });
976
+ }
977
+ return ValueOrErrors.Default.throwOne(`Error: parsing expected tuple of key and value, got ${JSON.stringify(kv)}`);
978
+ }))).Then((keyValues) => {
979
+ return ValueOrErrors.Default.return({
980
+ kind: "map",
981
+ value: result,
982
+ elementValues: keyValues.toArray(),
983
+ });
1468
984
  });
1469
- });
1470
985
  }
1471
- return ValueOrErrors.Default.throwOne(
1472
- `Error: parsing expected tuple of key and value, got ${JSON.stringify(kv)}`,
1473
- );
1474
- }),
1475
- ),
1476
- ).Then((keyValues) => {
1477
- return ValueOrErrors.Default.return({
1478
- kind: "map",
1479
- value: result,
1480
- elementValues: keyValues.toArray(),
986
+ return ValueOrErrors.Default.throwOne(`Error: parsing expected tuple of key value pairs, got ${JSON.stringify(raw)}`);
1481
987
  });
1482
- });
1483
988
  }
1484
- return ValueOrErrors.Default.throwOne(
1485
- `Error: parsing expected tuple of key value pairs, got ${JSON.stringify(raw)}`,
1486
- );
1487
- });
1488
- }
1489
- if (predicate.kind == "tuple") {
1490
- return calculateVisibility(predicate.value, bindings).Then((result) => {
1491
- if (PredicateValue.Operations.IsTuple(raw)) {
1492
- return ValueOrErrors.Operations.All(
1493
- List(
1494
- raw.values.map((value, index) => {
1495
- const elementLocal = raw.values.get(index);
1496
- if (elementLocal == undefined) {
1497
- return ValueOrErrors.Default.throwOne(
1498
- `Error: cannot find element of index ${index} in local ${JSON.stringify(raw)}`,
1499
- );
989
+ if (predicate.kind == "tuple") {
990
+ return calculateVisibility(predicate.value, bindings).Then((result) => {
991
+ if (PredicateValue.Operations.IsTuple(raw)) {
992
+ return ValueOrErrors.Operations.All(List(raw.values.map((value, index) => {
993
+ const elementLocal = raw.values.get(index);
994
+ if (elementLocal == undefined) {
995
+ return ValueOrErrors.Default.throwOne(`Error: cannot find element of index ${index} in local ${JSON.stringify(raw)}`);
996
+ }
997
+ const elementBindings = bindings.set("local", elementLocal);
998
+ return traverse(elementBindings, predicate.elementExpressions[index], value);
999
+ }))).Then((elementResults) => {
1000
+ return ValueOrErrors.Default.return({
1001
+ kind: "tuple",
1002
+ value: result,
1003
+ elementValues: elementResults.toArray(),
1004
+ });
1005
+ });
1500
1006
  }
1501
- const elementBindings = bindings.set("local", elementLocal);
1502
- return traverse(
1503
- elementBindings,
1504
- predicate.elementExpressions[index],
1505
- value,
1506
- );
1507
- }),
1508
- ),
1509
- ).Then((elementResults) => {
1510
- return ValueOrErrors.Default.return({
1511
- kind: "tuple",
1512
- value: result,
1513
- elementValues: elementResults.toArray(),
1007
+ return ValueOrErrors.Default.throwOne(`Error: parsing expected tuple, got ${JSON.stringify(raw)}`);
1514
1008
  });
1515
- });
1516
1009
  }
1517
- return ValueOrErrors.Default.throwOne(
1518
- `Error: parsing expected tuple, got ${JSON.stringify(raw)}`,
1519
- );
1520
- });
1521
- }
1522
- if (predicate.kind == "sum") {
1523
- return calculateVisibility(predicate.value, bindings).Then((result) => {
1524
- if (PredicateValue.Operations.IsSum(raw)) {
1525
- const local = raw.value.value;
1526
- const innerBindings = bindings.set("local", local);
1527
- return traverse(
1528
- innerBindings,
1529
- raw.value.kind === "l"
1530
- ? predicate.leftExpression
1531
- : predicate.rightExpression,
1532
- local,
1533
- ).Then((innerRes) => {
1534
- return ValueOrErrors.Default.return(
1535
- FormFieldPredicateEvaluation.Default.sum(result, innerRes),
1536
- );
1537
- });
1010
+ if (predicate.kind == "sum") {
1011
+ return calculateVisibility(predicate.value, bindings).Then((result) => {
1012
+ if (PredicateValue.Operations.IsSum(raw)) {
1013
+ const local = raw.value.value;
1014
+ const innerBindings = bindings.set("local", local);
1015
+ return traverse(innerBindings, raw.value.kind === "l"
1016
+ ? predicate.leftExpression
1017
+ : predicate.rightExpression, local).Then((innerRes) => {
1018
+ return ValueOrErrors.Default.return(FormFieldPredicateEvaluation.Default.sum(result, innerRes));
1019
+ });
1020
+ }
1021
+ return ValueOrErrors.Default.throwOne(`Error: parsing expected sum, got ${JSON.stringify(raw)}`);
1022
+ });
1538
1023
  }
1539
- return ValueOrErrors.Default.throwOne(
1540
- `Error: parsing expected sum, got ${JSON.stringify(raw)}`,
1541
- );
1542
- });
1543
- }
1544
- if (predicate.kind == "unit") {
1545
- return calculateVisibility(predicate.value, bindings).Then((result) => {
1546
- return ValueOrErrors.Default.return({
1547
- kind: "unit",
1548
- value: result,
1549
- });
1550
- });
1551
- }
1552
- return ValueOrErrors.Default.throwOne(
1553
- `Error: parsing unsupported predicate kind ${JSON.stringify(raw)}`,
1554
- );
1555
- };
1556
- const res = traverse(
1557
- bindings,
1558
- {
1559
- kind: "record",
1560
- value: true,
1561
- fields: context.visibilityPredicateExpressions,
1562
- },
1563
- root,
1564
- ).Then((visibilities) => {
1565
- return traverse(
1566
- bindings,
1567
- {
1024
+ if (predicate.kind == "unit") {
1025
+ return calculateVisibility(predicate.value, bindings).Then((result) => {
1026
+ return ValueOrErrors.Default.return({
1027
+ kind: "unit",
1028
+ value: result,
1029
+ });
1030
+ });
1031
+ }
1032
+ return ValueOrErrors.Default.throwOne(`Error: parsing unsupported predicate kind ${JSON.stringify(raw)}`);
1033
+ };
1034
+ const res = traverse(bindings, {
1568
1035
  kind: "record",
1569
1036
  value: true,
1570
- fields: context.disabledPredicatedExpressions,
1571
- },
1572
- root,
1573
- ).Then((disabledFields) => {
1574
- return ValueOrErrors.Default.return({
1575
- visiblityPredicateEvaluations: visibilities,
1576
- disabledPredicateEvaluations: disabledFields,
1577
- });
1037
+ fields: context.visibilityPredicateExpressions,
1038
+ }, root).Then((visibilities) => {
1039
+ return traverse(bindings, {
1040
+ kind: "record",
1041
+ value: true,
1042
+ fields: context.disabledPredicatedExpressions,
1043
+ }, root).Then((disabledFields) => {
1044
+ return ValueOrErrors.Default.return({
1045
+ visiblityPredicateEvaluations: visibilities,
1046
+ disabledPredicateEvaluations: disabledFields,
1047
+ });
1048
+ });
1578
1049
  });
1579
- });
1580
- if (res.kind == "errors") {
1581
- console.error("error evaluating predicates", res);
1582
- }
1583
- return res;
1050
+ if (res.kind == "errors") {
1051
+ console.error("error evaluating predicates", res);
1052
+ }
1053
+ return res;
1584
1054
  };
1585
- //# sourceMappingURL=state.js.map
1055
+ //# sourceMappingURL=state.js.map