ballerina-core 1.0.245 → 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 (321) 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/synchronized-entities/state.js +4 -7
  16. package/bin/src/async/domains/promise/state.d.ts +4 -9
  17. package/bin/src/async/domains/promise/state.js +9 -20
  18. package/bin/src/async/domains/synchronized/coroutines/synchronize.js +28 -80
  19. package/bin/src/async/domains/synchronized/state.d.ts +7 -14
  20. package/bin/src/async/domains/synchronized/state.js +6 -16
  21. package/bin/src/async/state.d.ts +45 -56
  22. package/bin/src/async/state.js +97 -115
  23. package/bin/src/baseEntity/domains/identifiable/state.d.ts +11 -15
  24. package/bin/src/baseEntity/domains/identifiable/state.js +9 -9
  25. package/bin/src/collections/domains/array/state.d.ts +7 -7
  26. package/bin/src/collections/domains/array/state.js +5 -5
  27. package/bin/src/collections/domains/errors/state.d.ts +10 -10
  28. package/bin/src/collections/domains/errors/state.js +10 -10
  29. package/bin/src/collections/domains/immutable/domains/list/state.js +44 -46
  30. package/bin/src/collections/domains/immutable/domains/map/state.js +23 -41
  31. package/bin/src/collections/domains/immutable/domains/orderedMap/state.js +65 -84
  32. package/bin/src/collections/domains/immutable/domains/ordereredSet/state.d.ts +6 -6
  33. package/bin/src/collections/domains/immutable/domains/ordereredSet/state.js +6 -6
  34. package/bin/src/collections/domains/maybe/state.d.ts +9 -9
  35. package/bin/src/collections/domains/maybe/state.js +9 -12
  36. package/bin/src/collections/domains/product/state.d.ts +19 -25
  37. package/bin/src/collections/domains/product/state.js +10 -13
  38. package/bin/src/collections/domains/sum/state.d.ts +77 -101
  39. package/bin/src/collections/domains/sum/state.js +32 -49
  40. package/bin/src/collections/domains/valueOrErrors/state.js +56 -81
  41. package/bin/src/coroutines/builder.js +19 -40
  42. package/bin/src/coroutines/state.js +306 -381
  43. package/bin/src/coroutines/template.js +59 -97
  44. package/bin/src/debounced/coroutines/debounce.js +89 -115
  45. package/bin/src/debounced/state.js +25 -62
  46. package/bin/src/diagnostics/domains/message-box/state.d.ts +1 -1
  47. package/bin/src/diagnostics/domains/message-box/state.js +3 -3
  48. package/bin/src/foreignMutations/state.d.ts +3 -3
  49. package/bin/src/foreignMutations/state.js +1 -1
  50. package/bin/src/forms/domains/attachments/views/attachments-view.js +8 -30
  51. package/bin/src/forms/domains/collection/domains/reference/state.js +20 -26
  52. package/bin/src/forms/domains/collection/domains/selection/state.js +1 -1
  53. package/bin/src/forms/domains/dispatched-forms/built-ins/state.js +754 -2007
  54. package/bin/src/forms/domains/dispatched-forms/deserializer/coroutines/runner.js +44 -123
  55. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/apis/state.js +166 -339
  56. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/enum/state.js +27 -40
  57. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/list/state.js +40 -76
  58. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/lookup/state.js +59 -102
  59. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/map/state.js +29 -64
  60. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/nestedRenderer/state.js +30 -64
  61. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/one/state.js +33 -88
  62. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/primitive/state.js +13 -21
  63. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/readOnly/state.js +23 -52
  64. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/record/domains/recordFieldRenderer/state.js +18 -59
  65. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/record/state.js +55 -129
  66. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/stream/state.js +27 -43
  67. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/sum/state.js +23 -63
  68. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/sumUnitDate/state.js +22 -39
  69. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/domains/tableCellRenderer/state.js +11 -46
  70. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.d.ts +6 -1
  71. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.d.ts.map +1 -1
  72. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.js +50 -146
  73. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.js.map +1 -1
  74. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/tuple/state.js +29 -64
  75. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/union/state.js +33 -78
  76. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/state.js +62 -157
  77. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/types/state.js +569 -977
  78. package/bin/src/forms/domains/dispatched-forms/deserializer/domains/specification/state.js +94 -255
  79. package/bin/src/forms/domains/dispatched-forms/deserializer/state.js +90 -322
  80. package/bin/src/forms/domains/dispatched-forms/deserializer/template.js +2 -3
  81. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/base-64-file/state.js +3 -3
  82. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/base-64-file/template.js +23 -49
  83. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/boolean/state.js +3 -3
  84. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/boolean/template.js +24 -52
  85. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/date/state.js +6 -18
  86. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/date/template.js +30 -64
  87. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum/state.js +6 -9
  88. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum/template.js +60 -153
  89. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum-multiselect/state.js +1 -1
  90. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/enum-multiselect/template.js +50 -127
  91. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/injectables/state.js +22 -40
  92. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/state.js +13 -31
  93. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.d.ts +2 -2
  94. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.d.ts.map +1 -1
  95. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.js +142 -417
  96. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/list/template.js.map +1 -1
  97. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/lookup-type/state.js +1 -1
  98. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/lookup-type/template.js +8 -28
  99. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/map/state.js +18 -61
  100. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/map/template.js +90 -329
  101. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/number/state.js +3 -3
  102. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/number/template.js +23 -54
  103. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/_debouncer.js +10 -22
  104. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/_initializeOne.js +31 -49
  105. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/_initializeStream.js +10 -29
  106. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/builder.js +2 -2
  107. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/coroutines/runner.js +26 -47
  108. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/state.js +40 -88
  109. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/one/template.js +152 -386
  110. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/readOnly/state.js +10 -19
  111. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/readOnly/template.js +21 -78
  112. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/record/state.js +11 -32
  113. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/record/template.js +77 -222
  114. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream/state.js +13 -35
  115. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream/template.js +68 -195
  116. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream-multiselect/state.js +13 -36
  117. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/searchable-infinite-stream-multiselect/template.js +106 -246
  118. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/secret/state.js +3 -3
  119. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/secret/template.js +23 -54
  120. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/state.js +27 -40
  121. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/string/state.js +3 -3
  122. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/string/template.js +26 -58
  123. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/sum/state.js +7 -22
  124. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/sum/template.js +53 -188
  125. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/builder.js +2 -2
  126. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/infiniteLoader.js +24 -57
  127. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/initialiseFiltersAndSorting.js +20 -70
  128. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/initialiseTable.js +27 -61
  129. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/loadWithRetries.js +19 -38
  130. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/coroutines/runner.js +15 -43
  131. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.d.ts +4 -0
  132. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.d.ts.map +1 -1
  133. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.js +137 -301
  134. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.d.ts +6 -2
  135. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.d.ts.map +1 -1
  136. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.js +238 -622
  137. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.js.map +1 -1
  138. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/tuple/state.js +8 -20
  139. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/tuple/template.js +35 -132
  140. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/union/state.js +8 -21
  141. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/union/template.js +32 -103
  142. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/unit/state.js +9 -12
  143. package/bin/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/unit/template.js +20 -54
  144. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.d.ts +8 -0
  145. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.d.ts.map +1 -1
  146. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.js +537 -676
  147. package/bin/src/forms/domains/dispatched-forms/runner/domains/deltas/state.js.map +1 -1
  148. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/list/state.js +18 -58
  149. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/lookup/state.js +14 -45
  150. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/map/state.js +18 -76
  151. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/multiSelection/state.js +24 -82
  152. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/nestedDispatcher/state.js +8 -37
  153. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/one/state.js +36 -120
  154. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/primitive/state.js +63 -145
  155. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/readOnly/state.js +12 -44
  156. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/record/recordField/state.js +4 -14
  157. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/record/state.js +25 -81
  158. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/singleSelectionDispatcher/state.js +24 -82
  159. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/sum/state.js +20 -63
  160. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.d.ts.map +1 -1
  161. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.js +74 -247
  162. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.js.map +1 -1
  163. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/tupleDispatcher/state.js +13 -61
  164. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/unionDispatcher/state.js +15 -64
  165. package/bin/src/forms/domains/dispatched-forms/runner/domains/dispatcher/state.js +45 -144
  166. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/_init.js +95 -203
  167. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/_sync.js +37 -79
  168. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/builder.js +2 -2
  169. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/runner.js +17 -19
  170. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/state.js +11 -58
  171. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/create/template.js +25 -73
  172. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/_init.js +95 -205
  173. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/_sync.js +37 -78
  174. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/builder.js +2 -2
  175. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/runner.js +17 -19
  176. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/state.js +11 -58
  177. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/edit/template.js +25 -71
  178. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/coroutines/runner.js +85 -163
  179. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/state.js +4 -10
  180. package/bin/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/template.js +27 -72
  181. package/bin/src/forms/domains/dispatched-forms/runner/domains/traversal/state.js +423 -773
  182. package/bin/src/forms/domains/dispatched-forms/runner/state.js +38 -62
  183. package/bin/src/forms/domains/dispatched-forms/runner/template.js +25 -78
  184. package/bin/src/forms/domains/launcher/coroutines/runner.js +45 -120
  185. package/bin/src/forms/domains/launcher/domains/create/coroutines/runner.js +101 -240
  186. package/bin/src/forms/domains/launcher/domains/create/state.js +17 -62
  187. package/bin/src/forms/domains/launcher/domains/create/template.js +42 -84
  188. package/bin/src/forms/domains/launcher/domains/edit/coroutines/runner.js +103 -242
  189. package/bin/src/forms/domains/launcher/domains/edit/state.js +17 -62
  190. package/bin/src/forms/domains/launcher/domains/edit/template.js +43 -86
  191. package/bin/src/forms/domains/launcher/domains/merger/state.d.ts +4 -4
  192. package/bin/src/forms/domains/launcher/domains/merger/state.js +26 -35
  193. package/bin/src/forms/domains/launcher/domains/passthrough/coroutines/runner.js +42 -88
  194. package/bin/src/forms/domains/launcher/domains/passthrough/state.js +19 -44
  195. package/bin/src/forms/domains/launcher/domains/passthrough/template.js +34 -56
  196. package/bin/src/forms/domains/launcher/state.js +6 -6
  197. package/bin/src/forms/domains/launcher/template.js +85 -169
  198. package/bin/src/forms/domains/parser/coroutines/runner.js +25 -87
  199. package/bin/src/forms/domains/parser/domains/built-ins/state.js +533 -944
  200. package/bin/src/forms/domains/parser/domains/deltas/state.js +318 -444
  201. package/bin/src/forms/domains/parser/domains/injectables/state.js +26 -29
  202. package/bin/src/forms/domains/parser/domains/layout/state.d.ts +1 -1
  203. package/bin/src/forms/domains/parser/domains/layout/state.d.ts.map +1 -1
  204. package/bin/src/forms/domains/parser/domains/layout/state.js +183 -265
  205. package/bin/src/forms/domains/parser/domains/layout/state.js.map +1 -1
  206. package/bin/src/forms/domains/parser/domains/predicates/domains/extractor/state.js +162 -324
  207. package/bin/src/forms/domains/parser/domains/predicates/state.js +979 -1509
  208. package/bin/src/forms/domains/parser/domains/renderer/state.js +480 -1137
  209. package/bin/src/forms/domains/parser/domains/types/state.js +170 -355
  210. package/bin/src/forms/domains/parser/domains/validator/state.js +280 -417
  211. package/bin/src/forms/domains/parser/state.js +373 -612
  212. package/bin/src/forms/domains/parser/template.js +1 -1
  213. package/bin/src/forms/domains/primitives/domains/base-64-file/state.js +5 -5
  214. package/bin/src/forms/domains/primitives/domains/base-64-file/template.js +19 -38
  215. package/bin/src/forms/domains/primitives/domains/boolean/state.js +5 -5
  216. package/bin/src/forms/domains/primitives/domains/boolean/template.js +19 -38
  217. package/bin/src/forms/domains/primitives/domains/date/state.js +9 -18
  218. package/bin/src/forms/domains/primitives/domains/date/template.js +25 -51
  219. package/bin/src/forms/domains/primitives/domains/enum/state.js +6 -6
  220. package/bin/src/forms/domains/primitives/domains/enum/template.js +48 -117
  221. package/bin/src/forms/domains/primitives/domains/enum-multiselect/state.js +1 -1
  222. package/bin/src/forms/domains/primitives/domains/enum-multiselect/template.js +40 -99
  223. package/bin/src/forms/domains/primitives/domains/list/state.js +14 -14
  224. package/bin/src/forms/domains/primitives/domains/list/template.js +71 -200
  225. package/bin/src/forms/domains/primitives/domains/map/state.js +14 -14
  226. package/bin/src/forms/domains/primitives/domains/map/template.js +103 -294
  227. package/bin/src/forms/domains/primitives/domains/number/state.js +5 -5
  228. package/bin/src/forms/domains/primitives/domains/number/template.js +19 -38
  229. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream/state.js +16 -33
  230. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream/template.js +62 -171
  231. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream-multiselect/state.js +1 -1
  232. package/bin/src/forms/domains/primitives/domains/searchable-infinite-stream-multiselect/template.js +69 -182
  233. package/bin/src/forms/domains/primitives/domains/secret/state.js +5 -5
  234. package/bin/src/forms/domains/primitives/domains/secret/template.js +19 -38
  235. package/bin/src/forms/domains/primitives/domains/string/state.js +5 -5
  236. package/bin/src/forms/domains/primitives/domains/string/template.js +22 -42
  237. package/bin/src/forms/domains/primitives/domains/sum/state.js +10 -10
  238. package/bin/src/forms/domains/primitives/domains/sum/template.js +50 -141
  239. package/bin/src/forms/domains/primitives/domains/tuple/state.js +9 -9
  240. package/bin/src/forms/domains/primitives/domains/tuple/template.js +33 -100
  241. package/bin/src/forms/domains/primitives/domains/unit/state.js +8 -8
  242. package/bin/src/forms/domains/primitives/domains/unit/template.js +9 -22
  243. package/bin/src/forms/domains/singleton/domains/form-label/state.d.ts +4 -4
  244. package/bin/src/forms/domains/singleton/domains/form-label/state.js +1 -1
  245. package/bin/src/forms/domains/singleton/state.js +10 -12
  246. package/bin/src/forms/domains/singleton/template.js +113 -288
  247. package/bin/src/fun/domains/curry/state.d.ts +2 -4
  248. package/bin/src/fun/domains/curry/state.js +1 -1
  249. package/bin/src/fun/domains/id/state.d.ts +1 -1
  250. package/bin/src/fun/domains/id/state.js +1 -1
  251. package/bin/src/fun/domains/predicate/domains/bool-expr.d.ts +41 -57
  252. package/bin/src/fun/domains/predicate/domains/bool-expr.js +67 -76
  253. package/bin/src/fun/domains/predicate/state.d.ts +7 -9
  254. package/bin/src/fun/domains/predicate/state.js +10 -14
  255. package/bin/src/fun/domains/simpleCallback/state.d.ts +1 -1
  256. package/bin/src/fun/domains/simpleCallback/state.js +1 -1
  257. package/bin/src/fun/domains/uncurry/state.d.ts +2 -4
  258. package/bin/src/fun/domains/uncurry/state.js +1 -1
  259. package/bin/src/fun/domains/unit/state.d.ts +1 -1
  260. package/bin/src/fun/domains/unit/state.js +1 -1
  261. package/bin/src/fun/domains/updater/domains/caseUpdater/state.d.ts +7 -22
  262. package/bin/src/fun/domains/updater/domains/caseUpdater/state.js +10 -18
  263. package/bin/src/fun/domains/updater/domains/mapUpdater/state.d.ts +13 -24
  264. package/bin/src/fun/domains/updater/domains/mapUpdater/state.js +10 -40
  265. package/bin/src/fun/domains/updater/domains/maybeUpdater/state.d.ts +13 -19
  266. package/bin/src/fun/domains/updater/domains/maybeUpdater/state.js +9 -20
  267. package/bin/src/fun/domains/updater/domains/orderedMapUpdater/state.d.ts +13 -24
  268. package/bin/src/fun/domains/updater/domains/orderedMapUpdater/state.js +11 -47
  269. package/bin/src/fun/domains/updater/domains/orderedSetUpdater/state.d.ts +8 -20
  270. package/bin/src/fun/domains/updater/domains/orderedSetUpdater/state.js +5 -17
  271. package/bin/src/fun/domains/updater/domains/replaceWith/state.d.ts +1 -1
  272. package/bin/src/fun/domains/updater/domains/replaceWith/state.js +1 -1
  273. package/bin/src/fun/domains/updater/domains/simpleUpdater/domains/baseSimpleUpdater/state.d.ts +4 -13
  274. package/bin/src/fun/domains/updater/domains/simpleUpdater/domains/baseSimpleUpdater/state.js +4 -6
  275. package/bin/src/fun/domains/updater/domains/simpleUpdater/state.d.ts +22 -60
  276. package/bin/src/fun/domains/updater/domains/simpleUpdater/state.js +31 -42
  277. package/bin/src/fun/domains/updater/state.d.ts +4 -4
  278. package/bin/src/fun/domains/updater/state.js +10 -12
  279. package/bin/src/fun/state.d.ts +3 -3
  280. package/bin/src/fun/state.js +7 -9
  281. package/bin/src/infinite-data-stream/coroutines/builder.js +1 -1
  282. package/bin/src/infinite-data-stream/coroutines/infiniteLoader.js +20 -47
  283. package/bin/src/infinite-data-stream/coroutines/runner.js +7 -7
  284. package/bin/src/infinite-data-stream/state.d.ts +51 -84
  285. package/bin/src/infinite-data-stream/state.js +61 -125
  286. package/bin/src/infinite-data-stream/template.js +2 -3
  287. package/bin/src/math/domains/DOMRect/state.d.ts +4 -4
  288. package/bin/src/math/domains/DOMRect/state.js +8 -10
  289. package/bin/src/math/domains/number/state.d.ts +5 -5
  290. package/bin/src/math/domains/number/state.js +5 -5
  291. package/bin/src/math/domains/rect/state.d.ts +8 -8
  292. package/bin/src/math/domains/rect/state.js +15 -16
  293. package/bin/src/math/domains/rgba/state.d.ts +17 -17
  294. package/bin/src/math/domains/rgba/state.js +81 -77
  295. package/bin/src/math/domains/size2/state.d.ts +8 -8
  296. package/bin/src/math/domains/size2/state.js +6 -6
  297. package/bin/src/math/domains/vector2/state.d.ts +10 -10
  298. package/bin/src/math/domains/vector2/state.js +8 -8
  299. package/bin/src/queue/state.d.ts +2 -2
  300. package/bin/src/queue/state.d.ts.map +1 -1
  301. package/bin/src/queue/state.js +2 -2
  302. package/bin/src/queue/state.js.map +1 -1
  303. package/bin/src/state/domains/repository/state.d.ts +9 -15
  304. package/bin/src/state/domains/repository/state.js +1 -1
  305. package/bin/src/template/state.js +115 -163
  306. package/bin/src/validation/state.js +45 -38
  307. package/bin/src/value/domains/mutable-value/state.js +2 -3
  308. package/bin/src/value/state.d.ts +9 -9
  309. package/bin/src/value/state.js +8 -11
  310. package/bin/src/value-infinite-data-stream/coroutines/builder.js +1 -1
  311. package/bin/src/value-infinite-data-stream/coroutines/infiniteLoader.js +20 -55
  312. package/bin/src/value-infinite-data-stream/coroutines/runner.js +4 -6
  313. package/bin/src/value-infinite-data-stream/state.js +77 -199
  314. package/bin/src/value-infinite-data-stream/template.js +2 -4
  315. package/bin/src/visibility/state.d.ts +2 -5
  316. package/bin/src/visibility/state.js +1 -1
  317. package/package.json +1 -1
  318. package/src/forms/domains/dispatched-forms/deserializer/domains/specification/domains/forms/domains/renderer/domains/table/state.ts +32 -15
  319. package/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.tsx +16 -3
  320. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.ts +1 -0
  321. package/src/forms/domains/parser/domains/layout/state.ts +11 -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