ballerina-core 1.0.256 → 1.0.258

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