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,13 +94,15 @@ 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 Lock
96
-
98
+ export function Lock(owner_, level_, queue_) {
99
+ return {owner_, level_, queue_};
100
+ }
97
101
 
98
102
  // type LockCondition
99
-
103
+ export function LockCondition(lock_, queue_) {
104
+ return {lock_, queue_};
105
+ }
100
106
 
101
107
 
102
108
 
@@ -105,19 +111,42 @@ import * as ff_core_UnsafeJs from "../../ff/core/UnsafeJs.mjs"
105
111
 
106
112
 
107
113
  export function Lock_condition(self_) {
108
- throw new Error('Function Lock_condition is missing on this target in sync context.');
114
+ return ff_core_Lock.LockCondition(self_, ff_core_Queue.new_())
109
115
  }
110
116
 
111
- export function Lock_acquire(self_, reentrant_) {
112
- throw new Error('Function Lock_acquire is missing on this target in sync context.');
117
+ export function Lock_acquire(self_) {
118
+ if(((self_.level_ === 0) || (self_.owner_ === $task))) {
119
+ self_.owner_ = $task;
120
+ self_.level_ += 1
121
+ } else {
122
+ ff_core_Js.awaitCancellablePromise_(((resolve_, reject_, onSettle_) => {
123
+ const key_ = ff_core_Queue.Queue_push(self_.queue_, ff_core_Pair.Pair($task, resolve_));
124
+ onSettle_(((_) => {
125
+ ff_core_Queue.Queue_remove(self_.queue_, key_)
126
+ }))
127
+ }))
128
+ }
113
129
  }
114
130
 
115
131
  export function Lock_release(self_) {
116
- throw new Error('Function Lock_release is missing on this target in sync context.');
132
+ if((self_.owner_ !== $task)) {
133
+ 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)})
134
+ } else if((self_.level_ > 1)) {
135
+ self_.level_ -= 1
136
+ } else {
137
+ self_.owner_ = (void 0);
138
+ self_.level_ = 0;
139
+ if((!ff_core_Queue.Queue_isEmpty(self_.queue_))) {
140
+ const pending_ = ff_core_Option.Option_grab(ff_core_Queue.Queue_pop(self_.queue_));
141
+ self_.owner_ = pending_.first_;
142
+ self_.level_ = 1;
143
+ pending_.second_((void 0))
144
+ }
145
+ }
117
146
  }
118
147
 
119
- export function Lock_do(self_, reentrant_, body_) {
120
- ff_core_Lock.Lock_acquire(self_, reentrant_);
148
+ export function Lock_do(self_, body_) {
149
+ ff_core_Lock.Lock_acquire(self_);
121
150
  try {
122
151
  return body_()
123
152
  } finally {
@@ -126,63 +155,42 @@ ff_core_Lock.Lock_release(self_)
126
155
  }
127
156
 
128
157
  export async function Lock_condition$(self_, $task) {
129
-
130
- return {lock: self_, stack: [], queue: []}
131
-
132
- }
133
-
134
- export async function Lock_acquire$(self_, reentrant_, $task) {
135
-
136
- if(self_.level === 0) {
137
- self_.owner = $task
138
- self_.level += 1
139
- } else {
140
- if(self_.owner !== $task || !reentrant_) {
141
- try {
142
- await new Promise((resolve, reject) => {
143
- $task.controller.signal.addEventListener('abort', reject)
144
- try {
145
- self_.queue.push({owner: $task, resolve: resolve})
146
- } finally {
147
- $task.controller.signal.removeEventListener('abort', reject)
148
- }
149
- })
150
- } finally {
151
- if($task.controller.signal.aborted) $task.controller = new AbortController()
152
- }
153
- } else {
154
- self_.level += 1
155
- }
156
- }
157
-
158
+ return ff_core_Lock.LockCondition(self_, ff_core_Queue.new_())
159
+ }
160
+
161
+ export async function Lock_acquire$(self_, $task) {
162
+ if(((self_.level_ === 0) || (self_.owner_ === $task))) {
163
+ self_.owner_ = $task;
164
+ self_.level_ += 1
165
+ } else {
166
+ (await ff_core_Js.awaitCancellablePromise_$((async (resolve_, reject_, onSettle_, $task) => {
167
+ const key_ = ff_core_Queue.Queue_push(self_.queue_, ff_core_Pair.Pair($task, resolve_));
168
+ (await onSettle_((async (_, $task) => {
169
+ ff_core_Queue.Queue_remove(self_.queue_, key_)
170
+ }), $task))
171
+ }), $task))
172
+ }
158
173
  }
159
174
 
160
175
  export async function Lock_release$(self_, $task) {
161
-
162
- if(self_.owner !== $task) {
163
- throw new Error("Tried to release a lock without acquiring it first.")
164
- } else if(self_.level > 1) {
165
- self_.level -= 1
166
- } else {
167
- self_.owner = null
168
- self_.level = 0
169
- if(self_.stack.length === 0) {
170
- const empty = self_.stack
171
- self_.stack = self_.queue.reverse()
172
- self_.queue = empty
173
- }
174
- if(self_.stack.length !== 0) {
175
- const pending = self_.stack.pop()
176
- self_.owner = pending.owner
177
- self_.level = 1
178
- pending.resolve()
179
- }
180
- }
181
-
182
- }
183
-
184
- export async function Lock_do$(self_, reentrant_, body_, $task) {
185
- (await ff_core_Lock.Lock_acquire$(self_, reentrant_, $task));
176
+ if((self_.owner_ !== $task)) {
177
+ 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)})
178
+ } else if((self_.level_ > 1)) {
179
+ self_.level_ -= 1
180
+ } else {
181
+ self_.owner_ = (void 0);
182
+ self_.level_ = 0;
183
+ if((!ff_core_Queue.Queue_isEmpty(self_.queue_))) {
184
+ const pending_ = ff_core_Option.Option_grab(ff_core_Queue.Queue_pop(self_.queue_));
185
+ self_.owner_ = pending_.first_;
186
+ self_.level_ = 1;
187
+ (await pending_.second_((void 0), $task))
188
+ }
189
+ }
190
+ }
191
+
192
+ export async function Lock_do$(self_, body_, $task) {
193
+ (await ff_core_Lock.Lock_acquire$(self_, $task));
186
194
  try {
187
195
  return (await body_($task))
188
196
  } finally {
@@ -191,7 +199,36 @@ return (await body_($task))
191
199
  }
192
200
 
193
201
  export function LockCondition_sleep(self_) {
194
- throw new Error('Function LockCondition_sleep is missing on this target in sync context.');
202
+ if((self_.lock_.owner_ !== $task)) {
203
+ 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)})
204
+ };
205
+ ;
206
+ const level_ = self_.lock_.level_;
207
+ self_.lock_.level_ = 1;
208
+ ff_core_Lock.Lock_release(self_.lock_);
209
+ try {
210
+ ff_core_Js.awaitCancellablePromise_(((resolve_, reject_, onSettle_) => {
211
+ const key_ = ff_core_Queue.Queue_push(self_.queue_, resolve_);
212
+ onSettle_(((_) => {
213
+ ff_core_Queue.Queue_remove(self_.queue_, key_)
214
+ }))
215
+ }))
216
+ } finally {
217
+ let error_;
218
+ let acquired_ = false;
219
+ while((!acquired_)) {
220
+ try {
221
+ ff_core_Lock.Lock_acquire(self_.lock_);
222
+ self_.lock_.level_ = level_;
223
+ acquired_ = true
224
+ } catch(e_) {
225
+ error_ = e_
226
+ }
227
+ };
228
+ if(ff_core_JsValue.JsValue_isUndefined(error_)) {
229
+ throw error_
230
+ }
231
+ }
195
232
  }
196
233
 
197
234
  export function LockCondition_sleepUntil(self_, body_) {
@@ -202,7 +239,7 @@ if(_1.Some) {
202
239
  const value_ = _1.value_;
203
240
  return value_
204
241
  }
205
- if(_1.None) {
242
+ {
206
243
  ff_core_Lock.LockCondition_sleep(self_);
207
244
  {
208
245
  const self_r_ = self_;
@@ -219,46 +256,53 @@ return
219
256
  }
220
257
 
221
258
  export function LockCondition_wakeOne(self_) {
222
- throw new Error('Function LockCondition_wakeOne is missing on this target in sync context.');
259
+ {
260
+ const if_o = ff_core_Queue.Queue_pop(self_.queue_)
261
+ if(if_o.Some) {
262
+ const resolve_ = if_o.value_;
263
+ resolve_((void 0))
264
+ }
265
+ }
223
266
  }
224
267
 
225
268
  export function LockCondition_wakeAll(self_) {
226
- throw new Error('Function LockCondition_wakeAll is missing on this target in sync context.');
269
+ ff_core_Queue.Queue_each(self_.queue_, ((_, resolve_) => {
270
+ resolve_((void 0))
271
+ }));
272
+ ff_core_Queue.Queue_clear(self_.queue_)
227
273
  }
228
274
 
229
275
  export async function LockCondition_sleep$(self_, $task) {
230
-
231
- if(self_.lock.owner !== $task) {
232
- throw new Error("Tried to sleep on a condition without acquiring it first.")
233
- }
234
- const level = self_.lock.level
235
- self_.lock.level = 1
236
- await ff_core_Lock.Lock_release$(self_.lock)
237
- try {
238
- await new Promise((resolve, reject) => {
239
- $task.controller.signal.addEventListener('abort', reject)
240
- try {
241
- self_.queue.push(resolve)
242
- } finally {
243
- $task.controller.signal.removeEventListener('abort', reject)
244
- if($task.controller.signal.aborted) $task.controller = new AbortController()
245
- }
246
- })
247
- } finally {
248
- let exception = null
249
- let acquired = false
250
- while(!acquired) {
251
- try {
252
- await ff_core_Lock.Lock_acquire$(self_.lock)
253
- self_.lock.level = level
254
- acquired = true
255
- } catch(e) {
256
- exception = e
257
- }
258
- }
259
- if(e !== null) throw e;
260
- }
261
-
276
+ if((self_.lock_.owner_ !== $task)) {
277
+ 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)})
278
+ };
279
+ ff_core_Task.Task_throwIfAborted($task);
280
+ const level_ = self_.lock_.level_;
281
+ self_.lock_.level_ = 1;
282
+ (await ff_core_Lock.Lock_release$(self_.lock_, $task));
283
+ try {
284
+ (await ff_core_Js.awaitCancellablePromise_$((async (resolve_, reject_, onSettle_, $task) => {
285
+ const key_ = ff_core_Queue.Queue_push(self_.queue_, resolve_);
286
+ (await onSettle_((async (_, $task) => {
287
+ ff_core_Queue.Queue_remove(self_.queue_, key_)
288
+ }), $task))
289
+ }), $task))
290
+ } finally {
291
+ let error_;
292
+ let acquired_ = false;
293
+ while((!acquired_)) {
294
+ try {
295
+ (await ff_core_Lock.Lock_acquire$(self_.lock_, $task));
296
+ self_.lock_.level_ = level_;
297
+ acquired_ = true
298
+ } catch(e_) {
299
+ error_ = e_
300
+ }
301
+ };
302
+ if(ff_core_JsValue.JsValue_isUndefined(error_)) {
303
+ throw error_
304
+ }
305
+ }
262
306
  }
263
307
 
264
308
  export async function LockCondition_sleepUntil$(self_, body_, $task) {
@@ -269,7 +313,7 @@ if(_1.Some) {
269
313
  const value_ = _1.value_;
270
314
  return value_
271
315
  }
272
- if(_1.None) {
316
+ {
273
317
  (await ff_core_Lock.LockCondition_sleep$(self_, $task));
274
318
  {
275
319
  const self_r_ = self_;
@@ -286,33 +330,20 @@ return
286
330
  }
287
331
 
288
332
  export async function LockCondition_wakeOne$(self_, $task) {
289
-
290
- if(self_.stack.length === 0) {
291
- const empty = self_.stack
292
- self_.stack = self_.queue.reverse()
293
- self_.queue = empty
294
- }
295
- if(self_.stack.length !== 0) {
296
- const resolve = self_.stack.pop()
297
- resolve()
298
- }
299
-
333
+ {
334
+ const if_o = ff_core_Queue.Queue_pop(self_.queue_)
335
+ if(if_o.Some) {
336
+ const resolve_ = if_o.value_;
337
+ (await resolve_((void 0), $task))
338
+ }
339
+ }
300
340
  }
301
341
 
302
342
  export async function LockCondition_wakeAll$(self_, $task) {
303
-
304
- while(self_.stack.length !== 0) {
305
- const resolve = self_.stack.pop()
306
- resolve()
307
- }
308
- const empty = self_.stack
309
- self_.stack = self_.queue.reverse()
310
- self_.queue = empty
311
- while(self_.stack.length !== 0) {
312
- const resolve = self_.stack.pop()
313
- resolve()
314
- }
315
-
343
+ (await ff_core_Queue.Queue_each$(self_.queue_, (async (_, resolve_, $task) => {
344
+ (await resolve_((void 0), $task))
345
+ }), $task));
346
+ ff_core_Queue.Queue_clear(self_.queue_)
316
347
  }
317
348
 
318
349
 
@@ -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,8 +94,6 @@ 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
 
96
98
 
97
99
 
@@ -125,7 +127,11 @@ console.error(value_)
125
127
  }
126
128
 
127
129
  export function trace_(value_) {
128
- process.stderr.write(value_ + String.fromCharCode(10))
130
+ if(false) {
131
+ console.debug(value_)
132
+ } else {
133
+ process.stderr.write((value_ + "\n"))
134
+ }
129
135
  }
130
136
 
131
137
  export async function show_$(value_, ff_core_Show_Show$T, $task) {
@@ -133,31 +139,35 @@ ff_core_Log.trace_(ff_core_Show_Show$T.show_(value_))
133
139
  }
134
140
 
135
141
  export async function debugDynamic_$(value_, $task) {
136
- throw new Error('Function debugDynamic is missing on this target in async context.');
142
+ console.debug(value_)
137
143
  }
138
144
 
139
145
  export async function debug_$(value_, $task) {
140
- throw new Error('Function debug is missing on this target in async context.');
146
+ console.debug(value_)
141
147
  }
142
148
 
143
149
  export async function verbose_$(value_, $task) {
144
- throw new Error('Function verbose is missing on this target in async context.');
150
+ console.log(value_)
145
151
  }
146
152
 
147
153
  export async function info_$(value_, $task) {
148
- throw new Error('Function info is missing on this target in async context.');
154
+ console.info(value_)
149
155
  }
150
156
 
151
157
  export async function warn_$(value_, $task) {
152
- throw new Error('Function warn is missing on this target in async context.');
158
+ console.warn(value_)
153
159
  }
154
160
 
155
161
  export async function error_$(value_, $task) {
156
- throw new Error('Function error is missing on this target in async context.');
162
+ console.error(value_)
157
163
  }
158
164
 
159
165
  export async function trace_$(value_, $task) {
160
- throw new Error('Function trace is missing on this target in async context.');
166
+ if(false) {
167
+ console.debug(value_)
168
+ } else {
169
+ process.stderr.write((value_ + "\n"))
170
+ }
161
171
  }
162
172
 
163
173
 
@@ -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_RbMap from "../../ff/core/RbMap.mjs"
@@ -92,8 +96,6 @@ import * as ff_core_Try from "../../ff/core/Try.mjs"
92
96
 
93
97
  import * as ff_core_Unit from "../../ff/core/Unit.mjs"
94
98
 
95
- import * as ff_core_UnsafeJs from "../../ff/core/UnsafeJs.mjs"
96
-
97
99
  // newtype Map
98
100
 
99
101
 
@@ -149,7 +151,7 @@ return result_
149
151
 
150
152
  export function Map_removeList(self_, keys_, ff_core_Ordering_Order$K) {
151
153
  let result_ = self_;
152
- for(let for_i = 0, for_a = keys_, for_l = for_a.length; for_i < for_l; for_i++) {
154
+ for(let for_a = keys_, for_i = 0, for_l = for_a.length; for_i < for_l; for_i++) {
153
155
  const k_ = for_a[for_i];
154
156
  result_ = ff_core_RbMap.delete_(k_, result_, ff_core_Ordering_Order$K)
155
157
  };
@@ -206,7 +208,7 @@ const _1 = ff_core_Map.Map_get(self_, key_, ff_core_Ordering_Order$K);
206
208
  if(_1.None) {
207
209
  return ff_core_Map.Map_add(self_, key_, default_(), ff_core_Ordering_Order$K)
208
210
  }
209
- if(_1.Some) {
211
+ {
210
212
  const v_ = _1.value_;
211
213
  return ff_core_Map.Map_add(self_, key_, update_(v_), ff_core_Ordering_Order$K)
212
214
  }
@@ -268,7 +270,7 @@ return result_
268
270
 
269
271
  export async function Map_removeList$(self_, keys_, ff_core_Ordering_Order$K, $task) {
270
272
  let result_ = self_;
271
- for(let for_i = 0, for_a = keys_, for_l = for_a.length; for_i < for_l; for_i++) {
273
+ for(let for_a = keys_, for_i = 0, for_l = for_a.length; for_i < for_l; for_i++) {
272
274
  const k_ = for_a[for_i];
273
275
  result_ = ff_core_RbMap.delete_(k_, result_, ff_core_Ordering_Order$K)
274
276
  };
@@ -325,7 +327,7 @@ const _1 = ff_core_Map.Map_get(self_, key_, ff_core_Ordering_Order$K);
325
327
  if(_1.None) {
326
328
  return ff_core_Map.Map_add(self_, key_, (await default_($task)), ff_core_Ordering_Order$K)
327
329
  }
328
- if(_1.Some) {
330
+ {
329
331
  const v_ = _1.value_;
330
332
  return ff_core_Map.Map_add(self_, key_, (await update_(v_, $task)), ff_core_Ordering_Order$K)
331
333
  }
@@ -366,7 +368,7 @@ const _1 = ff_core_Map.Map_get(self_, key_, ff_core_Ordering_Order$K);
366
368
  if(_1.None) {
367
369
  return ff_core_Map.Map_add(self_, key_, ff_core_List.List_toArray([value_]), ff_core_Ordering_Order$K)
368
370
  }
369
- if(_1.Some) {
371
+ {
370
372
  const array_ = _1.value_;
371
373
  array_.array.push(value_);
372
374
  return self_
@@ -380,7 +382,7 @@ const _1 = ff_core_Map.Map_get(self_, key_, ff_core_Ordering_Order$K);
380
382
  if(_1.None) {
381
383
  return ff_core_Map.Map_add(self_, key_, ff_core_List.List_toArray([value_]), ff_core_Ordering_Order$K)
382
384
  }
383
- if(_1.Some) {
385
+ {
384
386
  const array_ = _1.value_;
385
387
  array_.array.push(value_);
386
388
  return self_