firefly-compiler 0.5.35 → 0.5.37

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 (225) hide show
  1. package/.hintrc +4 -4
  2. package/.vscode/settings.json +4 -4
  3. package/bin/Release.ff +157 -154
  4. package/bin/firefly.mjs +1 -1
  5. package/compiler/Builder.ff +275 -277
  6. package/compiler/Compiler.ff +234 -233
  7. package/compiler/Dependencies.ff +186 -187
  8. package/compiler/DependencyLock.ff +17 -17
  9. package/compiler/Deriver.ff +23 -31
  10. package/compiler/Dictionaries.ff +1 -1
  11. package/compiler/Inference.ff +43 -20
  12. package/compiler/JsEmitter.ff +1437 -1282
  13. package/compiler/LspHook.ff +202 -202
  14. package/compiler/Main.ff +25 -24
  15. package/compiler/ModuleCache.ff +178 -178
  16. package/compiler/Parser.ff +36 -109
  17. package/compiler/Resolver.ff +5 -8
  18. package/compiler/Substitution.ff +1 -1
  19. package/compiler/Syntax.ff +1 -16
  20. package/compiler/Token.ff +9 -0
  21. package/compiler/Tokenizer.ff +4 -0
  22. package/compiler/Workspace.ff +88 -88
  23. package/core/.firefly/include/package.json +5 -5
  24. package/core/.firefly/package.ff +2 -2
  25. package/core/Any.ff +26 -30
  26. package/core/Array.ff +298 -265
  27. package/core/Atomic.ff +63 -64
  28. package/core/Box.ff +7 -7
  29. package/core/BrowserSystem.ff +40 -40
  30. package/core/Buffer.ff +185 -152
  31. package/core/BuildSystem.ff +156 -148
  32. package/core/Channel.ff +95 -92
  33. package/core/Char.ff +3 -2
  34. package/core/Core.ff +16 -23
  35. package/core/Crypto.ff +94 -96
  36. package/core/Equal.ff +41 -36
  37. package/core/Error.ff +15 -10
  38. package/core/FileHandle.ff +45 -37
  39. package/core/Float.ff +176 -200
  40. package/core/HttpClient.ff +142 -148
  41. package/core/Instant.ff +6 -8
  42. package/core/Int.ff +40 -24
  43. package/core/IntMap.ff +61 -39
  44. package/core/Js.ff +305 -0
  45. package/core/JsSystem.ff +135 -114
  46. package/core/JsValue.ff +303 -159
  47. package/core/Json.ff +423 -443
  48. package/core/List.ff +482 -486
  49. package/core/Lock.ff +108 -144
  50. package/core/Log.ff +25 -14
  51. package/core/NodeSystem.ff +198 -191
  52. package/core/Ordering.ff +160 -161
  53. package/core/Path.ff +377 -409
  54. package/core/Queue.ff +90 -0
  55. package/core/Random.ff +140 -134
  56. package/core/RbMap.ff +216 -216
  57. package/core/Serializable.ff +16 -13
  58. package/core/Show.ff +44 -43
  59. package/core/SourceLocation.ff +68 -68
  60. package/core/Stream.ff +1 -1
  61. package/core/String.ff +224 -202
  62. package/core/StringMap.ff +58 -36
  63. package/core/Task.ff +165 -149
  64. package/experimental/benchmarks/ListGrab.ff +23 -23
  65. package/experimental/benchmarks/ListGrab.java +55 -55
  66. package/experimental/benchmarks/Pyrotek45.ff +30 -30
  67. package/experimental/benchmarks/Pyrotek45.java +64 -64
  68. package/experimental/bidirectional/Bidi.ff +88 -88
  69. package/experimental/lines/Main.ff +40 -0
  70. package/experimental/random/Index.ff +53 -53
  71. package/experimental/random/Process.ff +120 -120
  72. package/experimental/random/RunLength.ff +65 -65
  73. package/experimental/random/Scrape.ff +51 -51
  74. package/experimental/random/Symbols.ff +73 -73
  75. package/experimental/random/Tensor.ff +52 -52
  76. package/experimental/random/Units.ff +36 -36
  77. package/experimental/s3/S3TestAuthorizationHeader.ff +39 -39
  78. package/experimental/s3/S3TestPut.ff +16 -16
  79. package/experimental/tests/TestJson.ff +26 -26
  80. package/firefly.sh +0 -0
  81. package/fireflysite/.firefly/package.ff +4 -4
  82. package/fireflysite/CommunityOverview.ff +20 -20
  83. package/fireflysite/CountingButtonDemo.ff +58 -58
  84. package/fireflysite/DocumentParser.ff +325 -331
  85. package/fireflysite/ExamplesOverview.ff +40 -40
  86. package/fireflysite/FrontPage.ff +344 -344
  87. package/fireflysite/GettingStarted.ff +45 -45
  88. package/fireflysite/Guide.ff +456 -456
  89. package/fireflysite/Main.ff +163 -152
  90. package/fireflysite/MatchingPasswordsDemo.ff +82 -82
  91. package/fireflysite/PackagesOverview.ff +49 -49
  92. package/fireflysite/PostgresqlDemo.ff +34 -34
  93. package/fireflysite/ReferenceAll.ff +18 -18
  94. package/fireflysite/ReferenceIntroduction.ff +11 -11
  95. package/fireflysite/Styles.ff +567 -567
  96. package/fireflysite/Test.ff +121 -62
  97. package/fireflysite/assets/markdown/reference/BaseTypes.md +209 -209
  98. package/fireflysite/assets/markdown/reference/EmittedJavascript.md +65 -65
  99. package/fireflysite/assets/markdown/reference/Exceptions.md +101 -101
  100. package/fireflysite/assets/markdown/reference/FunctionsAndMethods.md +364 -364
  101. package/fireflysite/assets/markdown/reference/JavascriptInterop.md +235 -172
  102. package/fireflysite/assets/markdown/reference/ModulesAndPackages.md +162 -162
  103. package/fireflysite/assets/markdown/reference/OldStructuredConcurrency.md +48 -48
  104. package/fireflysite/assets/markdown/reference/PatternMatching.md +224 -224
  105. package/fireflysite/assets/markdown/reference/StatementsAndExpressions.md +86 -86
  106. package/fireflysite/assets/markdown/reference/StructuredConcurrency.md +99 -99
  107. package/fireflysite/assets/markdown/reference/TraitsAndInstances.md +100 -100
  108. package/fireflysite/assets/markdown/reference/UserDefinedTypes.md +184 -184
  109. package/fireflysite/assets/markdown/scratch/ControlFlow.md +136 -136
  110. package/fireflysite/assets/markdown/scratch/Toc.md +40 -40
  111. package/lsp/.firefly/package.ff +1 -1
  112. package/lsp/CompletionHandler.ff +827 -827
  113. package/lsp/Handler.ff +714 -714
  114. package/lsp/HoverHandler.ff +79 -79
  115. package/lsp/LanguageServer.ff +272 -272
  116. package/lsp/SignatureHelpHandler.ff +55 -55
  117. package/lsp/SymbolHandler.ff +181 -181
  118. package/lsp/TestReferences.ff +17 -17
  119. package/lsp/TestReferencesCase.ff +7 -7
  120. package/lsp/stderr.txt +1 -1
  121. package/lsp/stdout.txt +34 -34
  122. package/lux/.firefly/package.ff +1 -1
  123. package/lux/Css.ff +648 -648
  124. package/lux/CssTest.ff +48 -48
  125. package/lux/Lux.ff +608 -617
  126. package/lux/LuxEvent.ff +79 -116
  127. package/lux/Main.ff +123 -123
  128. package/lux/Main2.ff +143 -143
  129. package/lux/TestDry.ff +28 -28
  130. package/output/js/ff/compiler/Builder.mjs +72 -71
  131. package/output/js/ff/compiler/Compiler.mjs +19 -13
  132. package/output/js/ff/compiler/Dependencies.mjs +8 -7
  133. package/output/js/ff/compiler/DependencyLock.mjs +6 -4
  134. package/output/js/ff/compiler/Deriver.mjs +26 -24
  135. package/output/js/ff/compiler/Dictionaries.mjs +14 -18
  136. package/output/js/ff/compiler/Environment.mjs +6 -4
  137. package/output/js/ff/compiler/Inference.mjs +238 -164
  138. package/output/js/ff/compiler/JsEmitter.mjs +1160 -350
  139. package/output/js/ff/compiler/JsImporter.mjs +20 -18
  140. package/output/js/ff/compiler/LspHook.mjs +12 -10
  141. package/output/js/ff/compiler/Main.mjs +61 -41
  142. package/output/js/ff/compiler/ModuleCache.mjs +10 -8
  143. package/output/js/ff/compiler/Parser.mjs +153 -669
  144. package/output/js/ff/compiler/Patterns.mjs +12 -10
  145. package/output/js/ff/compiler/Resolver.mjs +52 -78
  146. package/output/js/ff/compiler/Substitution.mjs +12 -16
  147. package/output/js/ff/compiler/Syntax.mjs +50 -341
  148. package/output/js/ff/compiler/Token.mjs +126 -4
  149. package/output/js/ff/compiler/Tokenizer.mjs +62 -52
  150. package/output/js/ff/compiler/Unification.mjs +74 -90
  151. package/output/js/ff/compiler/Wildcards.mjs +4 -2
  152. package/output/js/ff/compiler/Workspace.mjs +26 -20
  153. package/output/js/ff/core/Any.mjs +20 -20
  154. package/output/js/ff/core/Array.mjs +268 -175
  155. package/output/js/ff/core/AssetSystem.mjs +8 -6
  156. package/output/js/ff/core/Atomic.mjs +84 -52
  157. package/output/js/ff/core/Bool.mjs +6 -4
  158. package/output/js/ff/core/BrowserSystem.mjs +38 -29
  159. package/output/js/ff/core/Buffer.mjs +285 -133
  160. package/output/js/ff/core/BuildSystem.mjs +36 -56
  161. package/output/js/ff/core/Channel.mjs +250 -97
  162. package/output/js/ff/core/Char.mjs +5 -3
  163. package/output/js/ff/core/Core.mjs +28 -34
  164. package/output/js/ff/core/Crypto.mjs +30 -52
  165. package/output/js/ff/core/Duration.mjs +4 -2
  166. package/output/js/ff/core/Equal.mjs +14 -12
  167. package/output/js/ff/core/Error.mjs +17 -11
  168. package/output/js/ff/core/FileHandle.mjs +76 -38
  169. package/output/js/ff/core/Float.mjs +92 -160
  170. package/output/js/ff/core/HttpClient.mjs +208 -76
  171. package/output/js/ff/core/Instant.mjs +8 -10
  172. package/output/js/ff/core/Int.mjs +36 -26
  173. package/output/js/ff/core/IntMap.mjs +79 -33
  174. package/output/js/ff/core/Js.mjs +751 -0
  175. package/output/js/ff/core/JsSystem.mjs +54 -60
  176. package/output/js/ff/core/JsValue.mjs +294 -143
  177. package/output/js/ff/core/Json.mjs +443 -253
  178. package/output/js/ff/core/List.mjs +262 -214
  179. package/output/js/ff/core/Lock.mjs +156 -125
  180. package/output/js/ff/core/Log.mjs +20 -10
  181. package/output/js/ff/core/Map.mjs +10 -8
  182. package/output/js/ff/core/NodeSystem.mjs +189 -123
  183. package/output/js/ff/core/Nothing.mjs +4 -2
  184. package/output/js/ff/core/Option.mjs +40 -38
  185. package/output/js/ff/core/Ordering.mjs +26 -20
  186. package/output/js/ff/core/Pair.mjs +4 -2
  187. package/output/js/ff/core/Path.mjs +517 -315
  188. package/output/js/ff/core/Queue.mjs +306 -0
  189. package/output/js/ff/core/Random.mjs +141 -77
  190. package/output/js/ff/core/RbMap.mjs +36 -34
  191. package/output/js/ff/core/Serializable.mjs +44 -28
  192. package/output/js/ff/core/Set.mjs +6 -4
  193. package/output/js/ff/core/Show.mjs +8 -6
  194. package/output/js/ff/core/SourceLocation.mjs +4 -2
  195. package/output/js/ff/core/Stream.mjs +30 -50
  196. package/output/js/ff/core/String.mjs +263 -172
  197. package/output/js/ff/core/StringMap.mjs +77 -31
  198. package/output/js/ff/core/Task.mjs +91 -76
  199. package/output/js/ff/core/Try.mjs +20 -18
  200. package/output/js/ff/core/Unit.mjs +4 -2
  201. package/package.json +1 -1
  202. package/postgresql/Pg.ff +53 -59
  203. package/rpc/.firefly/package.ff +1 -1
  204. package/rpc/Rpc.ff +70 -70
  205. package/s3/.firefly/package.ff +1 -1
  206. package/s3/S3.ff +92 -94
  207. package/vscode/LICENSE.txt +21 -21
  208. package/vscode/Prepublish.ff +15 -15
  209. package/vscode/README.md +16 -16
  210. package/vscode/client/package-lock.json +544 -544
  211. package/vscode/client/package.json +22 -22
  212. package/vscode/client/src/extension.ts +104 -104
  213. package/vscode/icons/firefly-icon.svg +10 -10
  214. package/vscode/language-configuration.json +61 -61
  215. package/vscode/package-lock.json +3623 -3623
  216. package/vscode/package.json +1 -1
  217. package/vscode/snippets.json +241 -241
  218. package/vscode/syntaxes/firefly-markdown-injection.json +45 -45
  219. package/webserver/.firefly/include/package.json +5 -5
  220. package/webserver/.firefly/package.ff +2 -2
  221. package/webserver/WebServer.ff +647 -685
  222. package/websocket/.firefly/package.ff +1 -1
  223. package/websocket/WebSocket.ff +100 -131
  224. package/core/UnsafeJs.ff +0 -42
  225. package/output/js/ff/core/UnsafeJs.mjs +0 -191
@@ -42,6 +42,8 @@ import * as ff_core_Int from "../../ff/core/Int.mjs"
42
42
 
43
43
  import * as ff_core_IntMap from "../../ff/core/IntMap.mjs"
44
44
 
45
+ import * as ff_core_Js from "../../ff/core/Js.mjs"
46
+
45
47
  import * as ff_core_JsSystem from "../../ff/core/JsSystem.mjs"
46
48
 
47
49
  import * as ff_core_JsValue from "../../ff/core/JsValue.mjs"
@@ -68,6 +70,8 @@ import * as ff_core_Pair from "../../ff/core/Pair.mjs"
68
70
 
69
71
  import * as ff_core_Path from "../../ff/core/Path.mjs"
70
72
 
73
+ import * as ff_core_Queue from "../../ff/core/Queue.mjs"
74
+
71
75
  import * as ff_core_Random from "../../ff/core/Random.mjs"
72
76
 
73
77
  import * as ff_core_Serializable from "../../ff/core/Serializable.mjs"
@@ -90,33 +94,32 @@ import * as ff_core_Try from "../../ff/core/Try.mjs"
90
94
 
91
95
  import * as ff_core_Unit from "../../ff/core/Unit.mjs"
92
96
 
93
- import * as ff_core_UnsafeJs from "../../ff/core/UnsafeJs.mjs"
94
-
95
97
  // type StringMap
96
98
 
97
99
 
98
100
 
99
101
 
100
102
  export function new_() {
101
- return new Map()
103
+ return (new Map())
102
104
  }
103
105
 
104
106
  export async function new_$($task) {
105
- throw new Error('Function new is missing on this target in async context.');
107
+ return (new Map())
106
108
  }
107
109
 
108
110
  export function StringMap_get(self_, key_) {
109
- return self_.has(key_) ? ff_core_Option.Some(self_.get(key_)) : ff_core_Option.None()
111
+ const result_ = self_.get(key_);
112
+ if(((!ff_core_JsValue.JsValue_isUndefined(result_)) || self_.has(key_))) {
113
+ return ff_core_Option.Some(result_)
114
+ } else return ff_core_Option.None()
110
115
  }
111
116
 
112
117
  export function StringMap_grab(self_, key_) {
113
-
114
- const result = self_.get(key_)
115
- if(key_ === void 0 && !self_.has(key_)) {
116
- ff_core_Try.internalThrowGrabException_()
117
- }
118
- return result
119
-
118
+ const result_ = self_.get(key_);
119
+ if((ff_core_JsValue.JsValue_isUndefined(result_) && (!ff_core_StringMap.StringMap_has(self_, key_)))) {
120
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
121
+ };
122
+ return result_
120
123
  }
121
124
 
122
125
  export function StringMap_set(self_, key_, value_) {
@@ -139,12 +142,30 @@ export function StringMap_size(self_) {
139
142
  return self_.size
140
143
  }
141
144
 
145
+ export function StringMap_isEmpty(self_) {
146
+ return (ff_core_StringMap.StringMap_size(self_) === 0)
147
+ }
148
+
142
149
  export function StringMap_each(self_, body_) {
143
- self_.forEach((v, k) => body_(k, v))
150
+ if(false) {
151
+ const iterator_ = self_.entries();
152
+ let result_ = iterator_.next();
153
+ while((!result_.done)) {
154
+ const value_ = result_.value;
155
+ body_(value_[0], value_[1]);
156
+ result_ = iterator_.next()
157
+ }
158
+ } else {
159
+ self_.forEach(((v_, k_) => {
160
+ return body_(k_, v_)
161
+ }))
162
+ }
144
163
  }
145
164
 
146
165
  export function StringMap_eachWhile(self_, body_) {
147
- for(const [k, v] of self_) if(!body_(k, v)) break
166
+ ff_core_JsValue.JsValue_eachWhile(self_, ((value_) => {
167
+ return body_(value_[0], value_[1])
168
+ }))
148
169
  }
149
170
 
150
171
  export function StringMap_toArray(self_) {
@@ -172,7 +193,7 @@ const array_ = ff_core_Array.new_();
172
193
  ff_core_StringMap.StringMap_each(self_, ((k_, v_) => {
173
194
  array_.array.push(k_)
174
195
  }));
175
- return ff_core_Array.Array_toList(array_, 0, 9007199254740991)
196
+ return ff_core_Array.Array_drain(array_)
176
197
  }
177
198
 
178
199
  export function StringMap_values(self_) {
@@ -180,11 +201,11 @@ const array_ = ff_core_Array.new_();
180
201
  ff_core_StringMap.StringMap_each(self_, ((k_, v_) => {
181
202
  array_.array.push(v_)
182
203
  }));
183
- return ff_core_Array.Array_toList(array_, 0, 9007199254740991)
204
+ return ff_core_Array.Array_drain(array_)
184
205
  }
185
206
 
186
207
  export function StringMap_copy(self_) {
187
- return new Map(self_)
208
+ return (new Map(self_))
188
209
  }
189
210
 
190
211
  export function StringMap_getOrSet(self_, key_, body_) {
@@ -195,39 +216,64 @@ return ff_core_StringMap.StringMap_grab(self_, key_)
195
216
  }
196
217
 
197
218
  export async function StringMap_get$(self_, key_, $task) {
198
- throw new Error('Function StringMap_get is missing on this target in async context.');
219
+ const result_ = self_.get(key_);
220
+ if(((!ff_core_JsValue.JsValue_isUndefined(result_)) || self_.has(key_))) {
221
+ return ff_core_Option.Some(result_)
222
+ } else return ff_core_Option.None()
199
223
  }
200
224
 
201
225
  export async function StringMap_grab$(self_, key_, $task) {
202
- throw new Error('Function StringMap_grab is missing on this target in async context.');
226
+ const result_ = self_.get(key_);
227
+ if((ff_core_JsValue.JsValue_isUndefined(result_) && (!ff_core_StringMap.StringMap_has(self_, key_)))) {
228
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
229
+ };
230
+ return result_
203
231
  }
204
232
 
205
233
  export async function StringMap_set$(self_, key_, value_, $task) {
206
- throw new Error('Function StringMap_set is missing on this target in async context.');
234
+ self_.set(key_, value_)
207
235
  }
208
236
 
209
237
  export async function StringMap_has$(self_, key_, $task) {
210
- throw new Error('Function StringMap_has is missing on this target in async context.');
238
+ return self_.has(key_)
211
239
  }
212
240
 
213
241
  export async function StringMap_remove$(self_, key_, $task) {
214
- throw new Error('Function StringMap_remove is missing on this target in async context.');
242
+ return self_.delete(key_)
215
243
  }
216
244
 
217
245
  export async function StringMap_clear$(self_, $task) {
218
- throw new Error('Function StringMap_clear is missing on this target in async context.');
246
+ self_.clear()
219
247
  }
220
248
 
221
249
  export async function StringMap_size$(self_, $task) {
222
- throw new Error('Function StringMap_size is missing on this target in async context.');
250
+ return self_.size
251
+ }
252
+
253
+ export async function StringMap_isEmpty$(self_, $task) {
254
+ return (ff_core_StringMap.StringMap_size(self_) === 0)
223
255
  }
224
256
 
225
257
  export async function StringMap_each$(self_, body_, $task) {
226
- for(const [k, v] of self_) await body_(k, v)
258
+ if(true) {
259
+ const iterator_ = self_.entries();
260
+ let result_ = iterator_.next();
261
+ while((!result_.done)) {
262
+ const value_ = result_.value;
263
+ (await body_(value_[0], value_[1], $task));
264
+ result_ = iterator_.next()
265
+ }
266
+ } else {
267
+ self_.forEach((async (a_1, a_2) => await (async (v_, k_, $task) => {
268
+ return (await body_(k_, v_, $task))
269
+ })(a_1, a_2, $task)))
270
+ }
227
271
  }
228
272
 
229
273
  export async function StringMap_eachWhile$(self_, body_, $task) {
230
- for(const [k, v] of self_) if(!await body_(k, v)) break
274
+ (await ff_core_JsValue.JsValue_eachWhile$(self_, (async (value_, $task) => {
275
+ return (await body_(value_[0], value_[1], $task))
276
+ }), $task))
231
277
  }
232
278
 
233
279
  export async function StringMap_toArray$(self_, $task) {
@@ -255,7 +301,7 @@ const array_ = ff_core_Array.new_();
255
301
  ff_core_StringMap.StringMap_each(self_, ((k_, v_) => {
256
302
  array_.array.push(k_)
257
303
  }));
258
- return ff_core_Array.Array_toList(array_, 0, 9007199254740991)
304
+ return ff_core_Array.Array_drain(array_)
259
305
  }
260
306
 
261
307
  export async function StringMap_values$(self_, $task) {
@@ -263,11 +309,11 @@ const array_ = ff_core_Array.new_();
263
309
  ff_core_StringMap.StringMap_each(self_, ((k_, v_) => {
264
310
  array_.array.push(v_)
265
311
  }));
266
- return ff_core_Array.Array_toList(array_, 0, 9007199254740991)
312
+ return ff_core_Array.Array_drain(array_)
267
313
  }
268
314
 
269
315
  export async function StringMap_copy$(self_, $task) {
270
- throw new Error('Function StringMap_copy is missing on this target in async context.');
316
+ return (new Map(self_))
271
317
  }
272
318
 
273
319
  export async function StringMap_getOrSet$(self_, key_, body_, $task) {
@@ -284,7 +330,7 @@ if(_1.None) {
284
330
  ff_core_StringMap.StringMap_set(self_, key_, ff_core_List.List_toArray([value_]))
285
331
  return
286
332
  }
287
- if(_1.Some) {
333
+ {
288
334
  const array_ = _1.value_;
289
335
  array_.array.push(value_)
290
336
  return
@@ -299,7 +345,7 @@ if(_1.None) {
299
345
  ff_core_StringMap.StringMap_set(self_, key_, ff_core_List.List_toArray([value_]))
300
346
  return
301
347
  }
302
- if(_1.Some) {
348
+ {
303
349
  const array_ = _1.value_;
304
350
  array_.array.push(value_)
305
351
  return
@@ -42,6 +42,8 @@ import * as ff_core_Int from "../../ff/core/Int.mjs"
42
42
 
43
43
  import * as ff_core_IntMap from "../../ff/core/IntMap.mjs"
44
44
 
45
+ import * as ff_core_Js from "../../ff/core/Js.mjs"
46
+
45
47
  import * as ff_core_JsSystem from "../../ff/core/JsSystem.mjs"
46
48
 
47
49
  import * as ff_core_JsValue from "../../ff/core/JsValue.mjs"
@@ -68,6 +70,8 @@ import * as ff_core_Pair from "../../ff/core/Pair.mjs"
68
70
 
69
71
  import * as ff_core_Path from "../../ff/core/Path.mjs"
70
72
 
73
+ import * as ff_core_Queue from "../../ff/core/Queue.mjs"
74
+
71
75
  import * as ff_core_Random from "../../ff/core/Random.mjs"
72
76
 
73
77
  import * as ff_core_Serializable from "../../ff/core/Serializable.mjs"
@@ -90,10 +94,10 @@ import * as ff_core_Try from "../../ff/core/Try.mjs"
90
94
 
91
95
  import * as ff_core_Unit from "../../ff/core/Unit.mjs"
92
96
 
93
- import * as ff_core_UnsafeJs from "../../ff/core/UnsafeJs.mjs"
94
-
95
97
  // type Task
96
-
98
+ export function Task(controller_, subtasks_, promise_, started_) {
99
+ return {controller_, subtasks_, promise_, started_};
100
+ }
97
101
 
98
102
 
99
103
 
@@ -102,56 +106,55 @@ import * as ff_core_UnsafeJs from "../../ff/core/UnsafeJs.mjs"
102
106
 
103
107
 
104
108
  export function Task_spawn(self_, body_) {
105
-
106
- ff_core_Task.Task_throwIfAborted(self_)
107
- const task = {controller: new AbortController(), subtasks: new Set(), started: performance.now() * 0.001}
108
- self_.subtasks.add(task)
109
- task.promise = Promise.resolve(task).then(async () => {
110
- try {
111
- await body_(task, task)
112
- } catch(e) {
113
- await ff_core_Task.Task_abort$(self_)
114
- throw e
115
- } finally {
116
- for(const subtask of task.subtasks) subtask.controller.abort()
117
- await Promise.allSettled([...task.subtasks].map(subtask => subtask.promise))
118
- self_.subtasks.delete(task)
119
- }
120
- })
121
- return task
122
-
109
+ ff_core_Task.Task_throwIfAborted(self_);
110
+ const task_ = ff_core_Task.Task((new AbortController()), (new Set()), (void 0), (performance.now() * 0.001));
111
+ self_.subtasks_.add(task_);
112
+ task_.promise_ = Promise.resolve(task_).then(async () => {
113
+ return ff_core_Try.Try_finally(ff_core_Try.Try_tryCatchAny(ff_core_Core.try_((() => {
114
+ return body_(task_, task_)
115
+ })), ((e_) => {
116
+ self_.controller_.abort();
117
+ return ff_core_Error.Error_rethrow(e_)
118
+ })), (() => {
119
+ ff_core_JsValue.JsValue_each(task_.subtasks_, ((subtask_) => {
120
+ subtask_.controller_.abort()
121
+ }));
122
+ Promise.allSettled(ff_core_List.List_map([...task_.subtasks_], ((subtask_) => {
123
+ return subtask_.promise_
124
+ })));
125
+ self_.subtasks_.delete(task_)
126
+ }))
127
+ });
128
+ return task_
123
129
  }
124
130
 
125
131
  export function Task_throwIfAborted(self_) {
126
-
127
- if(self_.controller.signal.aborted) {
128
- const signal = self_.controller.signal
129
- self_.controller = new AbortController()
130
- signal.throwIfAborted()
131
- }
132
-
132
+ const signal_ = self_.controller_.signal;
133
+ if(signal_.aborted) {
134
+ self_.controller_ = (new AbortController());
135
+ signal_.throwIfAborted()
136
+ }
133
137
  }
134
138
 
135
139
  export function Task_abort(self_) {
136
-
137
- self_.controller.abort()
138
-
140
+ self_.controller_.abort()
139
141
  }
140
142
 
141
143
  export function Task_channel(self_, capacity_ = 0) {
142
- return {capacity: capacity_, buffer: [], readers: new Set(), writers: new Set()}
144
+ return ff_core_Channel.Channel(capacity_, ff_core_Array.new_(), (new Set()), (new Set()))
143
145
  }
144
146
 
145
147
  export function Task_lock(self_) {
146
- throw new Error('Function Task_lock is missing on this target in sync context.');
148
+ return ff_core_Lock.Lock((void 0), 0, ff_core_Queue.new_())
147
149
  }
148
150
 
149
151
  export function Task_now(self_) {
150
- return Date.now() * 0.001
152
+ return (Date.now() * 0.001)
151
153
  }
152
154
 
153
155
  export function Task_elapsed(self_) {
154
- return performance.now() * 0.001 - self_.started
156
+ const now_ = (performance.now() * 0.001);
157
+ return (now_ - self_.started_)
155
158
  }
156
159
 
157
160
  export function Task_time(self_, body_) {
@@ -163,37 +166,55 @@ return ff_core_Pair.Pair(result_, duration_)
163
166
  }
164
167
 
165
168
  export async function Task_spawn$(self_, body_, $task) {
166
-
167
- return ff_core_Task.Task_spawn(self_, body_)
168
-
169
+ (await ff_core_Task.Task_throwIfAborted$(self_, $task));
170
+ const task_ = ff_core_Task.Task((new AbortController()), (new Set()), (void 0), (performance.now() * 0.001));
171
+ self_.subtasks_.add(task_);
172
+ task_.promise_ = Promise.resolve(task_).then(async () => {
173
+ return ff_core_Try.Try_finally(ff_core_Try.Try_tryCatchAny(ff_core_Core.try_((async ($task) => {
174
+ return (await body_(task_, task_))
175
+ })), (async (e_, $task) => {
176
+ (await self_.controller_.abort());
177
+ return ff_core_Error.Error_rethrow(e_)
178
+ })), (async ($task) => {
179
+ ff_core_JsValue.JsValue_each(task_.subtasks_, ((subtask_) => {
180
+ subtask_.controller_.abort()
181
+ }));
182
+ (await Promise.allSettled(ff_core_List.List_map([...task_.subtasks_], ((subtask_) => {
183
+ return subtask_.promise_
184
+ }))));
185
+ self_.subtasks_.delete(task_)
186
+ }))
187
+ });
188
+ return task_
169
189
  }
170
190
 
171
191
  export async function Task_throwIfAborted$(self_, $task) {
172
-
173
- ff_core_Task.Task_throwIfAborted(self_)
174
-
192
+ const signal_ = self_.controller_.signal;
193
+ if(signal_.aborted) {
194
+ self_.controller_ = (new AbortController());
195
+ signal_.throwIfAborted()
196
+ }
175
197
  }
176
198
 
177
199
  export async function Task_abort$(self_, $task) {
178
-
179
- self_.controller.abort()
180
-
200
+ self_.controller_.abort()
181
201
  }
182
202
 
183
203
  export async function Task_channel$(self_, capacity_ = 0, $task) {
184
- return ff_core_Task.Task_channel(capacity_)
204
+ return ff_core_Channel.Channel(capacity_, ff_core_Array.new_(), (new Set()), (new Set()))
185
205
  }
186
206
 
187
207
  export async function Task_lock$(self_, $task) {
188
- return {owner: null, level: 0, stack: [], queue: []}
208
+ return ff_core_Lock.Lock((void 0), 0, ff_core_Queue.new_())
189
209
  }
190
210
 
191
211
  export async function Task_now$(self_, $task) {
192
- return Date.now() * 0.001
212
+ return (Date.now() * 0.001)
193
213
  }
194
214
 
195
215
  export async function Task_elapsed$(self_, $task) {
196
- return performance.now() * 0.001 - self_.started
216
+ const now_ = (performance.now() * 0.001);
217
+ return (now_ - self_.started_)
197
218
  }
198
219
 
199
220
  export async function Task_time$(self_, body_, $task) {
@@ -233,17 +254,14 @@ const successChannel_ = ff_core_Task.Task_channel(self_, 0);
233
254
  const failureChannel_ = ff_core_Task.Task_channel(self_, 0);
234
255
  ff_core_Task.Task_spawn(self_, ((t_) => {
235
256
  const channel_ = ff_core_Task.Task_channel(t_, 0);
236
- ff_core_Try.Try_catchAny(ff_core_Core.try_((() => {
237
- ff_core_List.List_each(ff_core_List.List_pairs(tasks_), ((_1) => {
238
- {
239
- const i_ = _1.first_;
240
- const task_ = _1.second_;
257
+ try {
258
+ for(let for_a = tasks_, for_i = 0, for_l = for_a.length; for_i < for_l; for_i++) {
259
+ const i_ = for_i;
260
+ const task_ = for_a[for_i];
241
261
  ff_core_Task.Task_spawn(t_, ((_) => {
242
262
  ff_core_Channel.Channel_write(channel_, ff_core_Pair.Pair(i_, task_()))
243
263
  }))
244
- return
245
- }
246
- }));
264
+ };
247
265
  const result_ = ff_core_List.List_map(ff_core_List.List_sortBy(ff_core_List.List_map(tasks_, ((_) => {
248
266
  return ff_core_Channel.Channel_read(channel_)
249
267
  })), ((_w1) => {
@@ -252,10 +270,10 @@ return _w1.first_
252
270
  return _w1.second_
253
271
  }));
254
272
  ff_core_Channel.Channel_write(successChannel_, result_)
255
- })), ((error_) => {
273
+ } catch(error_) {
256
274
  ff_core_Channel.Channel_write(failureChannel_, error_);
257
275
  ff_core_Task.Task_abort(t_)
258
- }))
276
+ }
259
277
  }));
260
278
  return ff_core_Channel.ChannelAction_wait(ff_core_Channel.ChannelAction_readOr(ff_core_Channel.readOr_(successChannel_, ((_w1) => {
261
279
  return _w1
@@ -270,14 +288,14 @@ const failureChannel_ = ff_core_Task.Task_channel(self_, 0);
270
288
  let live_ = tasks_.length;
271
289
  const started_ = ff_core_List.List_map(tasks_, ((task_) => {
272
290
  return ff_core_Task.Task_spawn(self_, ((_) => {
273
- ff_core_Try.Try_catchAny(ff_core_Core.try_((() => {
291
+ try {
274
292
  ff_core_Channel.Channel_write(successChannel_, task_())
275
- })), ((e_) => {
293
+ } catch(e_) {
276
294
  live_ -= 1;
277
295
  if((live_ === 0)) {
278
296
  ff_core_Channel.Channel_write(failureChannel_, e_)
279
297
  }
280
- }))
298
+ }
281
299
  }))
282
300
  }));
283
301
  try {
@@ -287,7 +305,7 @@ return _w1
287
305
  return ff_core_Error.Error_rethrow(_w1)
288
306
  })))
289
307
  } finally {
290
- for(let for_i = 0, for_a = started_, for_l = for_a.length; for_i < for_l; for_i++) {
308
+ for(let for_a = started_, for_i = 0, for_l = for_a.length; for_i < for_l; for_i++) {
291
309
  const _w1 = for_a[for_i];
292
310
  ff_core_Task.Task_abort(_w1)
293
311
  }
@@ -323,17 +341,14 @@ const successChannel_ = (await ff_core_Task.Task_channel$(self_, 0, $task));
323
341
  const failureChannel_ = (await ff_core_Task.Task_channel$(self_, 0, $task));
324
342
  (await ff_core_Task.Task_spawn$(self_, (async (t_, $task) => {
325
343
  const channel_ = (await ff_core_Task.Task_channel$(t_, 0, $task));
326
- (await ff_core_Try.Try_catchAny$((await ff_core_Core.try_$((async ($task) => {
327
- (await ff_core_List.List_each$(ff_core_List.List_pairs(tasks_), (async (_1, $task) => {
328
- {
329
- const i_ = _1.first_;
330
- const task_ = _1.second_;
344
+ try {
345
+ for(let for_a = tasks_, for_i = 0, for_l = for_a.length; for_i < for_l; for_i++) {
346
+ const i_ = for_i;
347
+ const task_ = for_a[for_i];
331
348
  (await ff_core_Task.Task_spawn$(t_, (async (_, $task) => {
332
349
  (await ff_core_Channel.Channel_write$(channel_, ff_core_Pair.Pair(i_, (await task_($task))), $task))
333
350
  }), $task))
334
- return
335
- }
336
- }), $task));
351
+ };
337
352
  const result_ = ff_core_List.List_map(ff_core_List.List_sortBy((await ff_core_List.List_map$(tasks_, (async (_, $task) => {
338
353
  return (await ff_core_Channel.Channel_read$(channel_, $task))
339
354
  }), $task)), ((_w1) => {
@@ -342,10 +357,10 @@ return _w1.first_
342
357
  return _w1.second_
343
358
  }));
344
359
  (await ff_core_Channel.Channel_write$(successChannel_, result_, $task))
345
- }), $task)), (async (error_, $task) => {
360
+ } catch(error_) {
346
361
  (await ff_core_Channel.Channel_write$(failureChannel_, error_, $task));
347
362
  (await ff_core_Task.Task_abort$(t_, $task))
348
- }), $task))
363
+ }
349
364
  }), $task));
350
365
  return (await ff_core_Channel.ChannelAction_wait$((await ff_core_Channel.ChannelAction_readOr$((await ff_core_Channel.readOr_$(successChannel_, (async (_w1, $task) => {
351
366
  return _w1
@@ -360,14 +375,14 @@ const failureChannel_ = (await ff_core_Task.Task_channel$(self_, 0, $task));
360
375
  let live_ = tasks_.length;
361
376
  const started_ = (await ff_core_List.List_map$(tasks_, (async (task_, $task) => {
362
377
  return (await ff_core_Task.Task_spawn$(self_, (async (_, $task) => {
363
- (await ff_core_Try.Try_catchAny$((await ff_core_Core.try_$((async ($task) => {
378
+ try {
364
379
  (await ff_core_Channel.Channel_write$(successChannel_, (await task_($task)), $task))
365
- }), $task)), (async (e_, $task) => {
380
+ } catch(e_) {
366
381
  live_ -= 1;
367
382
  if((live_ === 0)) {
368
383
  (await ff_core_Channel.Channel_write$(failureChannel_, e_, $task))
369
384
  }
370
- }), $task))
385
+ }
371
386
  }), $task))
372
387
  }), $task));
373
388
  try {
@@ -377,7 +392,7 @@ return _w1
377
392
  return ff_core_Error.Error_rethrow(_w1)
378
393
  }), $task)), $task))
379
394
  } finally {
380
- for(let for_i = 0, for_a = started_, for_l = for_a.length; for_i < for_l; for_i++) {
395
+ for(let for_a = started_, for_i = 0, for_l = for_a.length; for_i < for_l; for_i++) {
381
396
  const _w1 = for_a[for_i];
382
397
  (await ff_core_Task.Task_abort$(_w1, $task))
383
398
  }