firefly-compiler 0.4.78 → 0.4.79
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 +153 -153
- package/bin/firefly.mjs +1 -1
- package/compiler/Builder.ff +257 -257
- package/compiler/Compiler.ff +227 -227
- package/compiler/Dependencies.ff +187 -187
- package/compiler/DependencyLock.ff +17 -17
- package/compiler/JsEmitter.ff +946 -946
- package/compiler/LspHook.ff +202 -202
- package/compiler/ModuleCache.ff +178 -178
- package/compiler/Workspace.ff +88 -88
- package/core/.firefly/include/package-lock.json +564 -394
- package/core/.firefly/include/package.json +5 -5
- package/core/.firefly/include/prepare.sh +1 -1
- package/core/.firefly/package.ff +2 -2
- package/core/Array.ff +265 -265
- package/core/Atomic.ff +64 -64
- package/core/Box.ff +7 -7
- package/core/BrowserSystem.ff +40 -40
- package/core/BuildSystem.ff +148 -148
- package/core/Crypto.ff +96 -96
- package/core/Equal.ff +36 -36
- package/core/HttpClient.ff +148 -148
- package/core/JsSystem.ff +69 -69
- package/core/Json.ff +434 -434
- package/core/List.ff +486 -486
- package/core/Lock.ff +144 -144
- package/core/NodeSystem.ff +216 -216
- package/core/Ordering.ff +161 -161
- package/core/Path.ff +401 -401
- package/core/Random.ff +134 -134
- package/core/RbMap.ff +216 -216
- package/core/Show.ff +43 -43
- package/core/SourceLocation.ff +68 -68
- package/core/Task.ff +141 -141
- 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/random/Index.ff +53 -53
- package/experimental/random/Process.ff +120 -120
- 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 -38
- package/experimental/s3/S3TestPut.ff +16 -15
- 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 +218 -0
- package/fireflysite/ExamplesOverview.ff +40 -31
- package/fireflysite/FrontPage.ff +360 -0
- package/fireflysite/Guide.ff +411 -308
- package/fireflysite/GuideAll.ff +21 -0
- package/fireflysite/GuideBaseTypes.ff +168 -0
- package/fireflysite/GuideControlFlow.ff +212 -0
- package/fireflysite/GuideIntroduction.ff +52 -69
- package/fireflysite/Main.ff +137 -92
- package/fireflysite/MatchingPasswordsDemo.ff +82 -86
- package/fireflysite/PackagesOverview.ff +49 -49
- package/fireflysite/PostgresqlDemo.ff +34 -0
- package/fireflysite/Styles.ff +495 -306
- package/fireflysite/assets/NotoSansMono-Regular.ttf +0 -0
- package/fireflysite/assets/NunitoSans-VariableFont_YTLC,opsz,wdth,wght.ttf +0 -0
- package/fireflysite/assets/autocomplete-small.png +0 -0
- package/fireflysite/assets/autocomplete.png +0 -0
- package/fireflysite/assets/edit-time-error.png +0 -0
- package/fireflysite/assets/firefly-logo-yellow.png +0 -0
- package/fireflysite/assets/markdown/ControlFlow.md +136 -0
- package/fireflysite/assets/markdown/Example.md +78 -0
- package/lsp/.firefly/package.ff +1 -1
- package/lsp/CompletionHandler.ff +828 -828
- 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 +487 -487
- package/lux/LuxEvent.ff +116 -116
- package/lux/Main.ff +123 -123
- package/lux/Main2.ff +143 -143
- package/output/js/ff/compiler/Builder.mjs +43 -43
- package/output/js/ff/compiler/Dependencies.mjs +3 -3
- package/output/js/ff/core/Array.mjs +59 -59
- package/output/js/ff/core/Atomic.mjs +36 -36
- package/output/js/ff/core/BrowserSystem.mjs +11 -11
- package/output/js/ff/core/BuildSystem.mjs +30 -30
- package/output/js/ff/core/Crypto.mjs +40 -40
- package/output/js/ff/core/HttpClient.mjs +56 -56
- package/output/js/ff/core/Json.mjs +147 -147
- package/output/js/ff/core/List.mjs +50 -50
- package/output/js/ff/core/Lock.mjs +97 -97
- package/output/js/ff/core/NodeSystem.mjs +83 -83
- package/output/js/ff/core/Ordering.mjs +8 -8
- package/output/js/ff/core/Path.mjs +231 -231
- package/output/js/ff/core/Random.mjs +56 -56
- package/output/js/ff/core/Task.mjs +31 -31
- package/package.json +1 -1
- package/rpc/.firefly/package.ff +1 -1
- package/rpc/Rpc.ff +70 -70
- package/s3/.firefly/package.ff +1 -1
- package/s3/S3.ff +94 -94
- package/unsafejs/UnsafeJs.ff +19 -19
- package/vscode/LICENSE.txt +21 -21
- package/vscode/Prepublish.ff +15 -15
- package/vscode/README.md +16 -16
- 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 +15 -1
- package/vscode/snippets.json +241 -241
- package/vscode/syntaxes/firefly-markdown-injection.json +45 -0
- package/webserver/.firefly/include/package-lock.json +22 -16
- package/webserver/.firefly/include/package.json +5 -5
- package/webserver/.firefly/package.ff +2 -2
- package/webserver/WebServer.ff +685 -685
- package/websocket/.firefly/package.ff +1 -1
- package/websocket/WebSocket.ff +131 -131
- /package/fireflysite/{firefly-logo-notext.png → assets/firefly-logo-notext.png} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"dependencies": {
|
|
3
|
-
"esbuild": "^0.21.
|
|
4
|
-
}
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"dependencies": {
|
|
3
|
+
"esbuild": "^0.21.5"
|
|
4
|
+
}
|
|
5
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
npm install --no-bin-links esbuild
|
|
1
|
+
npm install --no-bin-links esbuild
|
package/core/.firefly/package.ff
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
package ff:core:0.0.0
|
|
2
|
-
include "node_modules"
|
|
1
|
+
package ff:core:0.0.0
|
|
2
|
+
include "node_modules"
|
package/core/Array.ff
CHANGED
|
@@ -1,265 +1,265 @@
|
|
|
1
|
-
class Array[T] {}
|
|
2
|
-
|
|
3
|
-
new[T](): Array[T]
|
|
4
|
-
target js sync "return {array: []}"
|
|
5
|
-
|
|
6
|
-
fill[T](size: Int, value: T): List[T]
|
|
7
|
-
target js sync """
|
|
8
|
-
return {array: new Array(size_).fill(value_)};
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
fillBy[T](size: Int, body: Int => T): List[T]
|
|
12
|
-
target js sync """
|
|
13
|
-
return {array: Array.from({length: size_}, (_, i) => body_(i))};
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
range(size: Int): List[Int]
|
|
17
|
-
target js sync """
|
|
18
|
-
return {array: Array.from({length: size_}, (_, i) => i)};
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
extend self[T]: Array[T] {
|
|
22
|
-
|
|
23
|
-
isEmpty(): Bool
|
|
24
|
-
target js sync "return self_.array.length === 0"
|
|
25
|
-
|
|
26
|
-
size(): Int
|
|
27
|
-
target js sync "return self_.array.length"
|
|
28
|
-
|
|
29
|
-
get(index: Int): Option[T]
|
|
30
|
-
target js sync """
|
|
31
|
-
return index_ >= 0 && index_ < self_.array.length
|
|
32
|
-
? ff_core_Option.Some(self_.array[index_])
|
|
33
|
-
: ff_core_Option.None()
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
grab(index: Int): T
|
|
37
|
-
target js sync """
|
|
38
|
-
return self_.array[index_] ?? internalGrab_(self_, index_);
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
grabFirst(): T {self.grab(0)}
|
|
42
|
-
|
|
43
|
-
grabLast(): T {self.grab(self.size() - 1)}
|
|
44
|
-
|
|
45
|
-
first(): Option[T]
|
|
46
|
-
target js sync """
|
|
47
|
-
return self_.array.length > 0
|
|
48
|
-
? ff_core_Option.Some(self_.array[0])
|
|
49
|
-
: ff_core_Option.None()
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
last(): Option[T]
|
|
53
|
-
target js sync """
|
|
54
|
-
return self_.array.length > 0
|
|
55
|
-
? ff_core_Option.Some(self_.array[self_.array.length - 1])
|
|
56
|
-
: ff_core_Option.None()
|
|
57
|
-
"""
|
|
58
|
-
|
|
59
|
-
push(value: T): Unit
|
|
60
|
-
target js sync "self_.array.push(value_)"
|
|
61
|
-
|
|
62
|
-
pushArray(value: Array[T]): Unit
|
|
63
|
-
target js sync "self_.array.push(...value_.array)"
|
|
64
|
-
|
|
65
|
-
pushList(value: List[T]): Unit
|
|
66
|
-
target js sync "self_.array.push(...value_)"
|
|
67
|
-
|
|
68
|
-
pop(): Option[T]
|
|
69
|
-
target js sync """
|
|
70
|
-
return self_.array.length > 0
|
|
71
|
-
? ff_core_Option.Some(self_.array.pop())
|
|
72
|
-
: ff_core_Option.None()
|
|
73
|
-
"""
|
|
74
|
-
|
|
75
|
-
set(index: Int, value: T): Unit
|
|
76
|
-
target js sync """
|
|
77
|
-
if(index_ < 0 || index_ > self_.array.length) {
|
|
78
|
-
ff_core_Try.internalThrowGrabException_()
|
|
79
|
-
}
|
|
80
|
-
self_.array[index_] = value_
|
|
81
|
-
"""
|
|
82
|
-
|
|
83
|
-
modify(index: Int, body: T => T): Unit
|
|
84
|
-
target js sync """
|
|
85
|
-
if(index_ < 0 || index_ >= self_.array.length) {
|
|
86
|
-
ff_core_Try.internalThrowGrabException_()
|
|
87
|
-
}
|
|
88
|
-
self_.array[index_] = body_(self_.array[index_])
|
|
89
|
-
"""
|
|
90
|
-
target js async """
|
|
91
|
-
if(index_ < 0 || index_ >= self_.array.length) {
|
|
92
|
-
ff_core_Try.internalThrowGrabException_()
|
|
93
|
-
}
|
|
94
|
-
self_.array[index_] = await body_(self_.array[index_], $task)
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
fill(value: T, start: Int = 0, end: Int = 9007199254740991): Unit
|
|
98
|
-
target js sync """
|
|
99
|
-
self_.array.fill(value_, start_, end_);
|
|
100
|
-
"""
|
|
101
|
-
|
|
102
|
-
copy(target: Int, start: Int, end: Int): Unit
|
|
103
|
-
target js sync """
|
|
104
|
-
self_.array.copyWithin(target_, start_, end_);
|
|
105
|
-
"""
|
|
106
|
-
|
|
107
|
-
delete(start: Int, deleteCount: Int): Unit
|
|
108
|
-
target js sync """
|
|
109
|
-
self_.array.splice(start_, deleteCount_);
|
|
110
|
-
"""
|
|
111
|
-
|
|
112
|
-
insert(start: Int, value: T, deleteCount: Int = 0): Unit
|
|
113
|
-
target js sync """
|
|
114
|
-
self_.array.splice(start_, deleteCount_, value_);
|
|
115
|
-
"""
|
|
116
|
-
|
|
117
|
-
insertArray(start: Int, value: Array[T], deleteCount: Int = 0): Unit
|
|
118
|
-
target js sync """
|
|
119
|
-
self_.array.splice(start_, deleteCount_, ...value_.array);
|
|
120
|
-
"""
|
|
121
|
-
|
|
122
|
-
insertList(start: Int, value: List[T], deleteCount: Int = 0): Unit
|
|
123
|
-
target js sync """
|
|
124
|
-
self_.array.splice(start_, deleteCount_, ...value_);
|
|
125
|
-
"""
|
|
126
|
-
|
|
127
|
-
each(body: T => Unit): Unit
|
|
128
|
-
target js sync """
|
|
129
|
-
return self_.array.forEach(body_);
|
|
130
|
-
"""
|
|
131
|
-
target js async """
|
|
132
|
-
for(let i = 0; i < self_.array.length; i++) {
|
|
133
|
-
await body_(self_.array[i], $task)
|
|
134
|
-
}
|
|
135
|
-
"""
|
|
136
|
-
|
|
137
|
-
eachWhile(body: T => Bool): Unit
|
|
138
|
-
target js sync "for(const value of self_.array) if(!body_(value)) break"
|
|
139
|
-
target js async "for(const value of self_.array) if(!await body_(value, $task)) break"
|
|
140
|
-
|
|
141
|
-
all(body: T => Bool): Bool {
|
|
142
|
-
mutable result = True
|
|
143
|
-
self.eachWhile {x =>
|
|
144
|
-
result = body(x)
|
|
145
|
-
result
|
|
146
|
-
}
|
|
147
|
-
result
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
any(body: T => Bool): Bool {
|
|
151
|
-
mutable result = False
|
|
152
|
-
self.eachWhile {x =>
|
|
153
|
-
result = body(x)
|
|
154
|
-
(!result)
|
|
155
|
-
}
|
|
156
|
-
result
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
find(body: T => Bool): Option[T] {
|
|
160
|
-
mutable result = None
|
|
161
|
-
self.eachWhile {x =>
|
|
162
|
-
if(body(x)) {
|
|
163
|
-
result = Some(x)
|
|
164
|
-
False
|
|
165
|
-
} else {
|
|
166
|
-
True
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
result
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
indexWhere(body: T => Bool): Option[Int] {
|
|
173
|
-
mutable i = -1
|
|
174
|
-
mutable result = False
|
|
175
|
-
self.eachWhile {x =>
|
|
176
|
-
i += 1
|
|
177
|
-
result = body(x)
|
|
178
|
-
(!result)
|
|
179
|
-
}
|
|
180
|
-
if(result) {i}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
drain(): List[T]
|
|
184
|
-
target js sync "const result = self_.array; self_.array = []; return result"
|
|
185
|
-
|
|
186
|
-
toList(start: Int = 0, end: Int = 9007199254740991): List[T]
|
|
187
|
-
target js sync """return self_.array.slice(start_, end_)"""
|
|
188
|
-
|
|
189
|
-
toStream(start: Int = 0, end: Int = 9007199254740991): Stream[T] {
|
|
190
|
-
self.toList(start, end).toStream()
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
reverse(): Unit
|
|
194
|
-
target js sync "self_.array.reverse()"
|
|
195
|
-
|
|
196
|
-
sortBy[S: Order](body: T => S): Unit {
|
|
197
|
-
self.sortWith {Ordering.compare(body(_), body(_))}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
sortWith(ordering: (T, T) => Ordering): Unit {
|
|
201
|
-
sortRange(self, ordering, 0, self.size())
|
|
202
|
-
}
|
|
203
|
-
target js sync "self_.array.sort((x, y) => ff_core_Ordering.Ordering_toInt(ordering_(x, y)))"
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
extend self[T: Order]: Array[T] {
|
|
208
|
-
|
|
209
|
-
sort(): Unit {
|
|
210
|
-
self.sortWith(Ordering.compare)
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
extend self: Array[String] {
|
|
216
|
-
|
|
217
|
-
join(separator: String = ""): String
|
|
218
|
-
target js sync "return self_.array.join(separator_)"
|
|
219
|
-
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
instance Array[T: Show]: Show {
|
|
223
|
-
show(value: Array[T]): String {
|
|
224
|
-
let array = Array.new()
|
|
225
|
-
array.push("[")
|
|
226
|
-
value.each {x =>
|
|
227
|
-
if(array.size() > 1) {array.push(", ")}
|
|
228
|
-
array.push(Show.show(x))
|
|
229
|
-
}
|
|
230
|
-
array.push("].toArray()")
|
|
231
|
-
array.join()
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
sortRange[T](array: Array[T], compare: (T, T) => Ordering, start: Int, end: Int): Unit {
|
|
236
|
-
if(end - start < 2) {} else:
|
|
237
|
-
|
|
238
|
-
mutable middle = start + (end - start).div(2)
|
|
239
|
-
sortRange(array, compare, start, middle)
|
|
240
|
-
sortRange(array, compare, middle, end)
|
|
241
|
-
|
|
242
|
-
mutable i = start
|
|
243
|
-
mutable j = middle
|
|
244
|
-
while {i < middle && j < end} {
|
|
245
|
-
if(compare(array.grab(i), array.grab(j)) != OrderingAfter) {
|
|
246
|
-
i += 1
|
|
247
|
-
} else {
|
|
248
|
-
let value = array.grab(j)
|
|
249
|
-
mutable k = j
|
|
250
|
-
while {k > i} {
|
|
251
|
-
array.set(k, array.grab(k - 1))
|
|
252
|
-
k -= 1
|
|
253
|
-
}
|
|
254
|
-
array.set(i, value)
|
|
255
|
-
i += 1
|
|
256
|
-
middle += 1
|
|
257
|
-
j += 1
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
internalGrab[T](self: Array[T], index: Int): T
|
|
263
|
-
target js sync """
|
|
264
|
-
return index_ < 0 || index_ >= self_.array.length ? ff_core_Try.internalThrowGrabException_() : self_.array[index_];
|
|
265
|
-
"""
|
|
1
|
+
class Array[T] {}
|
|
2
|
+
|
|
3
|
+
new[T](): Array[T]
|
|
4
|
+
target js sync "return {array: []}"
|
|
5
|
+
|
|
6
|
+
fill[T](size: Int, value: T): List[T]
|
|
7
|
+
target js sync """
|
|
8
|
+
return {array: new Array(size_).fill(value_)};
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
fillBy[T](size: Int, body: Int => T): List[T]
|
|
12
|
+
target js sync """
|
|
13
|
+
return {array: Array.from({length: size_}, (_, i) => body_(i))};
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
range(size: Int): List[Int]
|
|
17
|
+
target js sync """
|
|
18
|
+
return {array: Array.from({length: size_}, (_, i) => i)};
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
extend self[T]: Array[T] {
|
|
22
|
+
|
|
23
|
+
isEmpty(): Bool
|
|
24
|
+
target js sync "return self_.array.length === 0"
|
|
25
|
+
|
|
26
|
+
size(): Int
|
|
27
|
+
target js sync "return self_.array.length"
|
|
28
|
+
|
|
29
|
+
get(index: Int): Option[T]
|
|
30
|
+
target js sync """
|
|
31
|
+
return index_ >= 0 && index_ < self_.array.length
|
|
32
|
+
? ff_core_Option.Some(self_.array[index_])
|
|
33
|
+
: ff_core_Option.None()
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
grab(index: Int): T
|
|
37
|
+
target js sync """
|
|
38
|
+
return self_.array[index_] ?? internalGrab_(self_, index_);
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
grabFirst(): T {self.grab(0)}
|
|
42
|
+
|
|
43
|
+
grabLast(): T {self.grab(self.size() - 1)}
|
|
44
|
+
|
|
45
|
+
first(): Option[T]
|
|
46
|
+
target js sync """
|
|
47
|
+
return self_.array.length > 0
|
|
48
|
+
? ff_core_Option.Some(self_.array[0])
|
|
49
|
+
: ff_core_Option.None()
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
last(): Option[T]
|
|
53
|
+
target js sync """
|
|
54
|
+
return self_.array.length > 0
|
|
55
|
+
? ff_core_Option.Some(self_.array[self_.array.length - 1])
|
|
56
|
+
: ff_core_Option.None()
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
push(value: T): Unit
|
|
60
|
+
target js sync "self_.array.push(value_)"
|
|
61
|
+
|
|
62
|
+
pushArray(value: Array[T]): Unit
|
|
63
|
+
target js sync "self_.array.push(...value_.array)"
|
|
64
|
+
|
|
65
|
+
pushList(value: List[T]): Unit
|
|
66
|
+
target js sync "self_.array.push(...value_)"
|
|
67
|
+
|
|
68
|
+
pop(): Option[T]
|
|
69
|
+
target js sync """
|
|
70
|
+
return self_.array.length > 0
|
|
71
|
+
? ff_core_Option.Some(self_.array.pop())
|
|
72
|
+
: ff_core_Option.None()
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
set(index: Int, value: T): Unit
|
|
76
|
+
target js sync """
|
|
77
|
+
if(index_ < 0 || index_ > self_.array.length) {
|
|
78
|
+
ff_core_Try.internalThrowGrabException_()
|
|
79
|
+
}
|
|
80
|
+
self_.array[index_] = value_
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
modify(index: Int, body: T => T): Unit
|
|
84
|
+
target js sync """
|
|
85
|
+
if(index_ < 0 || index_ >= self_.array.length) {
|
|
86
|
+
ff_core_Try.internalThrowGrabException_()
|
|
87
|
+
}
|
|
88
|
+
self_.array[index_] = body_(self_.array[index_])
|
|
89
|
+
"""
|
|
90
|
+
target js async """
|
|
91
|
+
if(index_ < 0 || index_ >= self_.array.length) {
|
|
92
|
+
ff_core_Try.internalThrowGrabException_()
|
|
93
|
+
}
|
|
94
|
+
self_.array[index_] = await body_(self_.array[index_], $task)
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
fill(value: T, start: Int = 0, end: Int = 9007199254740991): Unit
|
|
98
|
+
target js sync """
|
|
99
|
+
self_.array.fill(value_, start_, end_);
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
copy(target: Int, start: Int, end: Int): Unit
|
|
103
|
+
target js sync """
|
|
104
|
+
self_.array.copyWithin(target_, start_, end_);
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
delete(start: Int, deleteCount: Int): Unit
|
|
108
|
+
target js sync """
|
|
109
|
+
self_.array.splice(start_, deleteCount_);
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
insert(start: Int, value: T, deleteCount: Int = 0): Unit
|
|
113
|
+
target js sync """
|
|
114
|
+
self_.array.splice(start_, deleteCount_, value_);
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
insertArray(start: Int, value: Array[T], deleteCount: Int = 0): Unit
|
|
118
|
+
target js sync """
|
|
119
|
+
self_.array.splice(start_, deleteCount_, ...value_.array);
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
insertList(start: Int, value: List[T], deleteCount: Int = 0): Unit
|
|
123
|
+
target js sync """
|
|
124
|
+
self_.array.splice(start_, deleteCount_, ...value_);
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
each(body: T => Unit): Unit
|
|
128
|
+
target js sync """
|
|
129
|
+
return self_.array.forEach(body_);
|
|
130
|
+
"""
|
|
131
|
+
target js async """
|
|
132
|
+
for(let i = 0; i < self_.array.length; i++) {
|
|
133
|
+
await body_(self_.array[i], $task)
|
|
134
|
+
}
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
eachWhile(body: T => Bool): Unit
|
|
138
|
+
target js sync "for(const value of self_.array) if(!body_(value)) break"
|
|
139
|
+
target js async "for(const value of self_.array) if(!await body_(value, $task)) break"
|
|
140
|
+
|
|
141
|
+
all(body: T => Bool): Bool {
|
|
142
|
+
mutable result = True
|
|
143
|
+
self.eachWhile {x =>
|
|
144
|
+
result = body(x)
|
|
145
|
+
result
|
|
146
|
+
}
|
|
147
|
+
result
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
any(body: T => Bool): Bool {
|
|
151
|
+
mutable result = False
|
|
152
|
+
self.eachWhile {x =>
|
|
153
|
+
result = body(x)
|
|
154
|
+
(!result)
|
|
155
|
+
}
|
|
156
|
+
result
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
find(body: T => Bool): Option[T] {
|
|
160
|
+
mutable result = None
|
|
161
|
+
self.eachWhile {x =>
|
|
162
|
+
if(body(x)) {
|
|
163
|
+
result = Some(x)
|
|
164
|
+
False
|
|
165
|
+
} else {
|
|
166
|
+
True
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
result
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
indexWhere(body: T => Bool): Option[Int] {
|
|
173
|
+
mutable i = -1
|
|
174
|
+
mutable result = False
|
|
175
|
+
self.eachWhile {x =>
|
|
176
|
+
i += 1
|
|
177
|
+
result = body(x)
|
|
178
|
+
(!result)
|
|
179
|
+
}
|
|
180
|
+
if(result) {i}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
drain(): List[T]
|
|
184
|
+
target js sync "const result = self_.array; self_.array = []; return result"
|
|
185
|
+
|
|
186
|
+
toList(start: Int = 0, end: Int = 9007199254740991): List[T]
|
|
187
|
+
target js sync """return self_.array.slice(start_, end_)"""
|
|
188
|
+
|
|
189
|
+
toStream(start: Int = 0, end: Int = 9007199254740991): Stream[T] {
|
|
190
|
+
self.toList(start, end).toStream()
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
reverse(): Unit
|
|
194
|
+
target js sync "self_.array.reverse()"
|
|
195
|
+
|
|
196
|
+
sortBy[S: Order](body: T => S): Unit {
|
|
197
|
+
self.sortWith {Ordering.compare(body(_), body(_))}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
sortWith(ordering: (T, T) => Ordering): Unit {
|
|
201
|
+
sortRange(self, ordering, 0, self.size())
|
|
202
|
+
}
|
|
203
|
+
target js sync "self_.array.sort((x, y) => ff_core_Ordering.Ordering_toInt(ordering_(x, y)))"
|
|
204
|
+
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
extend self[T: Order]: Array[T] {
|
|
208
|
+
|
|
209
|
+
sort(): Unit {
|
|
210
|
+
self.sortWith(Ordering.compare)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
extend self: Array[String] {
|
|
216
|
+
|
|
217
|
+
join(separator: String = ""): String
|
|
218
|
+
target js sync "return self_.array.join(separator_)"
|
|
219
|
+
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
instance Array[T: Show]: Show {
|
|
223
|
+
show(value: Array[T]): String {
|
|
224
|
+
let array = Array.new()
|
|
225
|
+
array.push("[")
|
|
226
|
+
value.each {x =>
|
|
227
|
+
if(array.size() > 1) {array.push(", ")}
|
|
228
|
+
array.push(Show.show(x))
|
|
229
|
+
}
|
|
230
|
+
array.push("].toArray()")
|
|
231
|
+
array.join()
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
sortRange[T](array: Array[T], compare: (T, T) => Ordering, start: Int, end: Int): Unit {
|
|
236
|
+
if(end - start < 2) {} else:
|
|
237
|
+
|
|
238
|
+
mutable middle = start + (end - start).div(2)
|
|
239
|
+
sortRange(array, compare, start, middle)
|
|
240
|
+
sortRange(array, compare, middle, end)
|
|
241
|
+
|
|
242
|
+
mutable i = start
|
|
243
|
+
mutable j = middle
|
|
244
|
+
while {i < middle && j < end} {
|
|
245
|
+
if(compare(array.grab(i), array.grab(j)) != OrderingAfter) {
|
|
246
|
+
i += 1
|
|
247
|
+
} else {
|
|
248
|
+
let value = array.grab(j)
|
|
249
|
+
mutable k = j
|
|
250
|
+
while {k > i} {
|
|
251
|
+
array.set(k, array.grab(k - 1))
|
|
252
|
+
k -= 1
|
|
253
|
+
}
|
|
254
|
+
array.set(i, value)
|
|
255
|
+
i += 1
|
|
256
|
+
middle += 1
|
|
257
|
+
j += 1
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
internalGrab[T](self: Array[T], index: Int): T
|
|
263
|
+
target js sync """
|
|
264
|
+
return index_ < 0 || index_ >= self_.array.length ? ff_core_Try.internalThrowGrabException_() : self_.array[index_];
|
|
265
|
+
"""
|
package/core/Atomic.ff
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
class Atomic[T] {}
|
|
2
|
-
|
|
3
|
-
new[T](value: T): Atomic[T]
|
|
4
|
-
target js sync """
|
|
5
|
-
return {value: value_}
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
extend self[T]: Atomic[T] {
|
|
9
|
-
|
|
10
|
-
modify(body: T => T): T
|
|
11
|
-
target js sync """
|
|
12
|
-
return self_.value = body_(self_.value)
|
|
13
|
-
"""
|
|
14
|
-
target js async """
|
|
15
|
-
let currentValue, newValue
|
|
16
|
-
do {
|
|
17
|
-
currentValue = self_.value
|
|
18
|
-
newValue = await body_(currentValue)
|
|
19
|
-
} while(currentValue !== self_.value)
|
|
20
|
-
self_.value = newValue
|
|
21
|
-
return newValue
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
getAndModify(body: T => T): T
|
|
25
|
-
target js sync """
|
|
26
|
-
const currentValue = self_.value
|
|
27
|
-
self_.value = body_(currentValue)
|
|
28
|
-
return currentValue
|
|
29
|
-
"""
|
|
30
|
-
target js async """
|
|
31
|
-
let currentValue, newValue
|
|
32
|
-
do {
|
|
33
|
-
currentValue = self_.value
|
|
34
|
-
newValue = await body_(currentValue)
|
|
35
|
-
} while(currentValue !== self_.value)
|
|
36
|
-
self_.value = newValue
|
|
37
|
-
return currentValue
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
get(): T
|
|
41
|
-
target js sync """
|
|
42
|
-
return self_.value
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
set(value: T): Unit
|
|
46
|
-
target js sync """
|
|
47
|
-
self_.value = value
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
getAndSet(newValue: T): T
|
|
51
|
-
target js sync """
|
|
52
|
-
const currentValue = self_.value
|
|
53
|
-
self_.value = newValue
|
|
54
|
-
return currentValue
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
compareAndSet(currentValue: T, newValue: T): Bool
|
|
58
|
-
target js sync """
|
|
59
|
-
if(self_.value !== currentValue) return false
|
|
60
|
-
self_.value = newValue
|
|
61
|
-
return true
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
}
|
|
1
|
+
class Atomic[T] {}
|
|
2
|
+
|
|
3
|
+
new[T](value: T): Atomic[T]
|
|
4
|
+
target js sync """
|
|
5
|
+
return {value: value_}
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
extend self[T]: Atomic[T] {
|
|
9
|
+
|
|
10
|
+
modify(body: T => T): T
|
|
11
|
+
target js sync """
|
|
12
|
+
return self_.value = body_(self_.value)
|
|
13
|
+
"""
|
|
14
|
+
target js async """
|
|
15
|
+
let currentValue, newValue
|
|
16
|
+
do {
|
|
17
|
+
currentValue = self_.value
|
|
18
|
+
newValue = await body_(currentValue)
|
|
19
|
+
} while(currentValue !== self_.value)
|
|
20
|
+
self_.value = newValue
|
|
21
|
+
return newValue
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
getAndModify(body: T => T): T
|
|
25
|
+
target js sync """
|
|
26
|
+
const currentValue = self_.value
|
|
27
|
+
self_.value = body_(currentValue)
|
|
28
|
+
return currentValue
|
|
29
|
+
"""
|
|
30
|
+
target js async """
|
|
31
|
+
let currentValue, newValue
|
|
32
|
+
do {
|
|
33
|
+
currentValue = self_.value
|
|
34
|
+
newValue = await body_(currentValue)
|
|
35
|
+
} while(currentValue !== self_.value)
|
|
36
|
+
self_.value = newValue
|
|
37
|
+
return currentValue
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
get(): T
|
|
41
|
+
target js sync """
|
|
42
|
+
return self_.value
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
set(value: T): Unit
|
|
46
|
+
target js sync """
|
|
47
|
+
self_.value = value
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
getAndSet(newValue: T): T
|
|
51
|
+
target js sync """
|
|
52
|
+
const currentValue = self_.value
|
|
53
|
+
self_.value = newValue
|
|
54
|
+
return currentValue
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
compareAndSet(currentValue: T, newValue: T): Bool
|
|
58
|
+
target js sync """
|
|
59
|
+
if(self_.value !== currentValue) return false
|
|
60
|
+
self_.value = newValue
|
|
61
|
+
return true
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
}
|