ballerina-core 1.0.245 → 1.0.247

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