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.
- package/.hintrc +4 -4
- package/.vscode/settings.json +4 -4
- package/bin/Release.ff +157 -154
- package/bin/firefly.mjs +1 -1
- package/compiler/Builder.ff +275 -277
- package/compiler/Compiler.ff +234 -233
- package/compiler/Dependencies.ff +186 -187
- package/compiler/DependencyLock.ff +17 -17
- package/compiler/Deriver.ff +23 -31
- package/compiler/Dictionaries.ff +1 -1
- package/compiler/Inference.ff +43 -20
- package/compiler/JsEmitter.ff +1437 -1282
- package/compiler/LspHook.ff +202 -202
- package/compiler/Main.ff +25 -24
- package/compiler/ModuleCache.ff +178 -178
- package/compiler/Parser.ff +36 -109
- package/compiler/Resolver.ff +5 -8
- package/compiler/Substitution.ff +1 -1
- package/compiler/Syntax.ff +1 -16
- package/compiler/Token.ff +9 -0
- package/compiler/Tokenizer.ff +4 -0
- package/compiler/Workspace.ff +88 -88
- package/core/.firefly/include/package.json +5 -5
- package/core/.firefly/package.ff +2 -2
- package/core/Any.ff +26 -30
- package/core/Array.ff +298 -265
- package/core/Atomic.ff +63 -64
- package/core/Box.ff +7 -7
- package/core/BrowserSystem.ff +40 -40
- package/core/Buffer.ff +185 -152
- package/core/BuildSystem.ff +156 -148
- package/core/Channel.ff +95 -92
- package/core/Char.ff +3 -2
- package/core/Core.ff +16 -23
- package/core/Crypto.ff +94 -96
- package/core/Equal.ff +41 -36
- package/core/Error.ff +15 -10
- package/core/FileHandle.ff +45 -37
- package/core/Float.ff +176 -200
- package/core/HttpClient.ff +142 -148
- package/core/Instant.ff +6 -8
- package/core/Int.ff +40 -24
- package/core/IntMap.ff +61 -39
- package/core/Js.ff +305 -0
- package/core/JsSystem.ff +135 -114
- package/core/JsValue.ff +303 -159
- package/core/Json.ff +423 -443
- package/core/List.ff +482 -486
- package/core/Lock.ff +108 -144
- package/core/Log.ff +25 -14
- package/core/NodeSystem.ff +198 -191
- package/core/Ordering.ff +160 -161
- package/core/Path.ff +377 -409
- package/core/Queue.ff +90 -0
- package/core/Random.ff +140 -134
- package/core/RbMap.ff +216 -216
- package/core/Serializable.ff +16 -13
- package/core/Show.ff +44 -43
- package/core/SourceLocation.ff +68 -68
- package/core/Stream.ff +1 -1
- package/core/String.ff +224 -202
- package/core/StringMap.ff +58 -36
- package/core/Task.ff +165 -149
- package/experimental/benchmarks/ListGrab.ff +23 -23
- package/experimental/benchmarks/ListGrab.java +55 -55
- package/experimental/benchmarks/Pyrotek45.ff +30 -30
- package/experimental/benchmarks/Pyrotek45.java +64 -64
- package/experimental/bidirectional/Bidi.ff +88 -88
- package/experimental/lines/Main.ff +40 -0
- package/experimental/random/Index.ff +53 -53
- package/experimental/random/Process.ff +120 -120
- package/experimental/random/RunLength.ff +65 -65
- package/experimental/random/Scrape.ff +51 -51
- package/experimental/random/Symbols.ff +73 -73
- package/experimental/random/Tensor.ff +52 -52
- package/experimental/random/Units.ff +36 -36
- package/experimental/s3/S3TestAuthorizationHeader.ff +39 -39
- package/experimental/s3/S3TestPut.ff +16 -16
- package/experimental/tests/TestJson.ff +26 -26
- package/firefly.sh +0 -0
- package/fireflysite/.firefly/package.ff +4 -4
- package/fireflysite/CommunityOverview.ff +20 -20
- package/fireflysite/CountingButtonDemo.ff +58 -58
- package/fireflysite/DocumentParser.ff +325 -331
- package/fireflysite/ExamplesOverview.ff +40 -40
- package/fireflysite/FrontPage.ff +344 -344
- package/fireflysite/GettingStarted.ff +45 -45
- package/fireflysite/Guide.ff +456 -456
- package/fireflysite/Main.ff +163 -152
- package/fireflysite/MatchingPasswordsDemo.ff +82 -82
- package/fireflysite/PackagesOverview.ff +49 -49
- package/fireflysite/PostgresqlDemo.ff +34 -34
- package/fireflysite/ReferenceAll.ff +18 -18
- package/fireflysite/ReferenceIntroduction.ff +11 -11
- package/fireflysite/Styles.ff +567 -567
- package/fireflysite/Test.ff +121 -62
- package/fireflysite/assets/markdown/reference/BaseTypes.md +209 -209
- package/fireflysite/assets/markdown/reference/EmittedJavascript.md +65 -65
- package/fireflysite/assets/markdown/reference/Exceptions.md +101 -101
- package/fireflysite/assets/markdown/reference/FunctionsAndMethods.md +364 -364
- package/fireflysite/assets/markdown/reference/JavascriptInterop.md +235 -172
- package/fireflysite/assets/markdown/reference/ModulesAndPackages.md +162 -162
- package/fireflysite/assets/markdown/reference/OldStructuredConcurrency.md +48 -48
- package/fireflysite/assets/markdown/reference/PatternMatching.md +224 -224
- package/fireflysite/assets/markdown/reference/StatementsAndExpressions.md +86 -86
- package/fireflysite/assets/markdown/reference/StructuredConcurrency.md +99 -99
- package/fireflysite/assets/markdown/reference/TraitsAndInstances.md +100 -100
- package/fireflysite/assets/markdown/reference/UserDefinedTypes.md +184 -184
- package/fireflysite/assets/markdown/scratch/ControlFlow.md +136 -136
- package/fireflysite/assets/markdown/scratch/Toc.md +40 -40
- package/lsp/.firefly/package.ff +1 -1
- package/lsp/CompletionHandler.ff +827 -827
- package/lsp/Handler.ff +714 -714
- package/lsp/HoverHandler.ff +79 -79
- package/lsp/LanguageServer.ff +272 -272
- package/lsp/SignatureHelpHandler.ff +55 -55
- package/lsp/SymbolHandler.ff +181 -181
- package/lsp/TestReferences.ff +17 -17
- package/lsp/TestReferencesCase.ff +7 -7
- package/lsp/stderr.txt +1 -1
- package/lsp/stdout.txt +34 -34
- package/lux/.firefly/package.ff +1 -1
- package/lux/Css.ff +648 -648
- package/lux/CssTest.ff +48 -48
- package/lux/Lux.ff +608 -617
- package/lux/LuxEvent.ff +79 -116
- package/lux/Main.ff +123 -123
- package/lux/Main2.ff +143 -143
- package/lux/TestDry.ff +28 -28
- package/output/js/ff/compiler/Builder.mjs +72 -71
- package/output/js/ff/compiler/Compiler.mjs +19 -13
- package/output/js/ff/compiler/Dependencies.mjs +8 -7
- package/output/js/ff/compiler/DependencyLock.mjs +6 -4
- package/output/js/ff/compiler/Deriver.mjs +26 -24
- package/output/js/ff/compiler/Dictionaries.mjs +14 -18
- package/output/js/ff/compiler/Environment.mjs +6 -4
- package/output/js/ff/compiler/Inference.mjs +238 -164
- package/output/js/ff/compiler/JsEmitter.mjs +1160 -350
- package/output/js/ff/compiler/JsImporter.mjs +20 -18
- package/output/js/ff/compiler/LspHook.mjs +12 -10
- package/output/js/ff/compiler/Main.mjs +61 -41
- package/output/js/ff/compiler/ModuleCache.mjs +10 -8
- package/output/js/ff/compiler/Parser.mjs +153 -669
- package/output/js/ff/compiler/Patterns.mjs +12 -10
- package/output/js/ff/compiler/Resolver.mjs +52 -78
- package/output/js/ff/compiler/Substitution.mjs +12 -16
- package/output/js/ff/compiler/Syntax.mjs +50 -341
- package/output/js/ff/compiler/Token.mjs +126 -4
- package/output/js/ff/compiler/Tokenizer.mjs +62 -52
- package/output/js/ff/compiler/Unification.mjs +74 -90
- package/output/js/ff/compiler/Wildcards.mjs +4 -2
- package/output/js/ff/compiler/Workspace.mjs +26 -20
- package/output/js/ff/core/Any.mjs +20 -20
- package/output/js/ff/core/Array.mjs +268 -175
- package/output/js/ff/core/AssetSystem.mjs +8 -6
- package/output/js/ff/core/Atomic.mjs +84 -52
- package/output/js/ff/core/Bool.mjs +6 -4
- package/output/js/ff/core/BrowserSystem.mjs +38 -29
- package/output/js/ff/core/Buffer.mjs +285 -133
- package/output/js/ff/core/BuildSystem.mjs +36 -56
- package/output/js/ff/core/Channel.mjs +250 -97
- package/output/js/ff/core/Char.mjs +5 -3
- package/output/js/ff/core/Core.mjs +28 -34
- package/output/js/ff/core/Crypto.mjs +30 -52
- package/output/js/ff/core/Duration.mjs +4 -2
- package/output/js/ff/core/Equal.mjs +14 -12
- package/output/js/ff/core/Error.mjs +17 -11
- package/output/js/ff/core/FileHandle.mjs +76 -38
- package/output/js/ff/core/Float.mjs +92 -160
- package/output/js/ff/core/HttpClient.mjs +208 -76
- package/output/js/ff/core/Instant.mjs +8 -10
- package/output/js/ff/core/Int.mjs +36 -26
- package/output/js/ff/core/IntMap.mjs +79 -33
- package/output/js/ff/core/Js.mjs +751 -0
- package/output/js/ff/core/JsSystem.mjs +54 -60
- package/output/js/ff/core/JsValue.mjs +294 -143
- package/output/js/ff/core/Json.mjs +443 -253
- package/output/js/ff/core/List.mjs +262 -214
- package/output/js/ff/core/Lock.mjs +156 -125
- package/output/js/ff/core/Log.mjs +20 -10
- package/output/js/ff/core/Map.mjs +10 -8
- package/output/js/ff/core/NodeSystem.mjs +189 -123
- package/output/js/ff/core/Nothing.mjs +4 -2
- package/output/js/ff/core/Option.mjs +40 -38
- package/output/js/ff/core/Ordering.mjs +26 -20
- package/output/js/ff/core/Pair.mjs +4 -2
- package/output/js/ff/core/Path.mjs +517 -315
- package/output/js/ff/core/Queue.mjs +306 -0
- package/output/js/ff/core/Random.mjs +141 -77
- package/output/js/ff/core/RbMap.mjs +36 -34
- package/output/js/ff/core/Serializable.mjs +44 -28
- package/output/js/ff/core/Set.mjs +6 -4
- package/output/js/ff/core/Show.mjs +8 -6
- package/output/js/ff/core/SourceLocation.mjs +4 -2
- package/output/js/ff/core/Stream.mjs +30 -50
- package/output/js/ff/core/String.mjs +263 -172
- package/output/js/ff/core/StringMap.mjs +77 -31
- package/output/js/ff/core/Task.mjs +91 -76
- package/output/js/ff/core/Try.mjs +20 -18
- package/output/js/ff/core/Unit.mjs +4 -2
- package/package.json +1 -1
- package/postgresql/Pg.ff +53 -59
- package/rpc/.firefly/package.ff +1 -1
- package/rpc/Rpc.ff +70 -70
- package/s3/.firefly/package.ff +1 -1
- package/s3/S3.ff +92 -94
- package/vscode/LICENSE.txt +21 -21
- package/vscode/Prepublish.ff +15 -15
- package/vscode/README.md +16 -16
- package/vscode/client/package-lock.json +544 -544
- package/vscode/client/package.json +22 -22
- package/vscode/client/src/extension.ts +104 -104
- package/vscode/icons/firefly-icon.svg +10 -10
- package/vscode/language-configuration.json +61 -61
- package/vscode/package-lock.json +3623 -3623
- package/vscode/package.json +1 -1
- package/vscode/snippets.json +241 -241
- package/vscode/syntaxes/firefly-markdown-injection.json +45 -45
- package/webserver/.firefly/include/package.json +5 -5
- package/webserver/.firefly/package.ff +2 -2
- package/webserver/WebServer.ff +647 -685
- package/websocket/.firefly/package.ff +1 -1
- package/websocket/WebSocket.ff +100 -131
- package/core/UnsafeJs.ff +0 -42
- 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
|
-
|
|
107
|
+
return (new Map())
|
|
106
108
|
}
|
|
107
109
|
|
|
108
110
|
export function StringMap_get(self_, key_) {
|
|
109
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
234
|
+
self_.set(key_, value_)
|
|
207
235
|
}
|
|
208
236
|
|
|
209
237
|
export async function StringMap_has$(self_, key_, $task) {
|
|
210
|
-
|
|
238
|
+
return self_.has(key_)
|
|
211
239
|
}
|
|
212
240
|
|
|
213
241
|
export async function StringMap_remove$(self_, key_, $task) {
|
|
214
|
-
|
|
242
|
+
return self_.delete(key_)
|
|
215
243
|
}
|
|
216
244
|
|
|
217
245
|
export async function StringMap_clear$(self_, $task) {
|
|
218
|
-
|
|
246
|
+
self_.clear()
|
|
219
247
|
}
|
|
220
248
|
|
|
221
249
|
export async function StringMap_size$(self_, $task) {
|
|
222
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
312
|
+
return ff_core_Array.Array_drain(array_)
|
|
267
313
|
}
|
|
268
314
|
|
|
269
315
|
export async function StringMap_copy$(self_, $task) {
|
|
270
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
291
|
+
try {
|
|
274
292
|
ff_core_Channel.Channel_write(successChannel_, task_())
|
|
275
|
-
}
|
|
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
|
|
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
|
-
|
|
327
|
-
(
|
|
328
|
-
|
|
329
|
-
const
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
|
|
378
|
+
try {
|
|
364
379
|
(await ff_core_Channel.Channel_write$(successChannel_, (await task_($task)), $task))
|
|
365
|
-
}
|
|
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
|
-
}
|
|
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
|
|
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
|
}
|