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
package/core/Array.ff CHANGED
@@ -1,265 +1,298 @@
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
+ Js->(array = [])?
5
+ }
6
+
7
+ fill[T](size: Int, value: T): List[T] {
8
+ Js->(array = List.fill(size, value)!)?
9
+ }
10
+
11
+ fillBy[T](size: Int, body: Int => T): List[T] {
12
+ Js->(array = List.fillBy(size, body)!)?
13
+ }
14
+
15
+ range(size: Int): List[Int] {
16
+ Js->(array = List.range(size)!)?
17
+ }
18
+
19
+ extend self[T]: Array[T] {
20
+
21
+ isEmpty(): Bool {
22
+ self.size() == 0
23
+ }
24
+
25
+ size(): Int {
26
+ self!->array->length?
27
+ }
28
+
29
+ get(index: Int): Option[T] {
30
+ if(index >= 0 && index < self.size()) {
31
+ Some(self!->array.get(index)?)
32
+ } else {
33
+ None
34
+ }
35
+ }
36
+
37
+ grab(index: Int): T {
38
+ if(index < 0 || index >= self.size()) {
39
+ throw(GrabException())
40
+ }
41
+ self!->array.get(index)?
42
+ }
43
+
44
+ first(): Option[T] {self.get(0)}
45
+
46
+ last(): Option[T] {self.get(self.size() - 1)}
47
+
48
+ grabFirst(): T {self.grab(0)}
49
+
50
+ grabLast(): T {self.grab(self.size() - 1)}
51
+
52
+ push(value: T): Unit {
53
+ self!->array->push(value!)?
54
+ }
55
+
56
+ pushArray(value: Array[T]): Unit {
57
+ self.pushList(value!->array?)
58
+ }
59
+
60
+ pushList(list: List[T]): Unit {
61
+ let originalLength = self.size()
62
+ self!->array->length += list.size()
63
+ 0.until(list.size()).each {i =>
64
+ self!->array.set(originalLength + i, list!.get(i))
65
+ }
66
+ }
67
+
68
+ pop(): Option[T] {
69
+ if(self.size() > 0) {
70
+ self!->array->pop()?
71
+ }
72
+ }
73
+
74
+ set(index: Int, value: T): Unit {
75
+ if(index < 0 || index >= self.size()) {
76
+ throw(GrabException())
77
+ }
78
+ self!->array.set(index, value!)
79
+ }
80
+
81
+ modify(index: Int, body: T => T): Unit {
82
+ if(index < 0 || index >= self.size()) {
83
+ throw(GrabException())
84
+ }
85
+ self!->array.set(index, body(self!->array.get(index)?)!)
86
+ }
87
+
88
+ fill(value: T, start: Int = 0, end: Int = 9007199254740991): Unit {
89
+ self!->array->fill(value!, start, end)
90
+ }
91
+
92
+ copy(target: Int, start: Int, end: Int): Unit {
93
+ self!->array->copyWithin(target, start, end)
94
+ }
95
+
96
+ delete(start: Int, deleteCount: Int): Unit {
97
+ self!->array->splice(start, deleteCount)
98
+ }
99
+
100
+ insert(start: Int, value: T, deleteCount: Int = 0): Unit {
101
+ self!->array->splice(start, deleteCount, value!)
102
+ }
103
+
104
+ insertArray(start: Int, array: Array[T], deleteCount: Int = 0): Unit {
105
+ self.insertList(start, array!->array?, deleteCount)
106
+ }
107
+
108
+ insertList(start: Int, list: List[T], deleteCount: Int = 0): Unit {
109
+ if(start < 0 || start > self.size()) {
110
+ throw(GrabException())
111
+ }
112
+
113
+ let deleteEnd = start + deleteCount
114
+
115
+ if(deleteEnd < 0 || deleteEnd > self.size()) {
116
+ throw(GrabException())
117
+ }
118
+
119
+ let insertCount = list.size()
120
+ let delta = insertCount - deleteCount
121
+
122
+ if(delta > 0) {
123
+ self!->array->length += delta
124
+ self!->array->copyWithin(start + insertCount, deleteEnd)
125
+ } elseIf {delta < 0} {
126
+ self!->array->copyWithin(start + insertCount, deleteEnd)
127
+ self!->array->length += delta
128
+ }
129
+
130
+ 0.until(insertCount).each {i =>
131
+ self!->array.set(start + i, list!.get(i))
132
+ }
133
+ }
134
+
135
+ mapInPlace[S](body: T => S): Unit {
136
+ mutable i = 0
137
+ while {i < self.size()} {
138
+ self!->array.set(i, body(self!->array.get(i)?)!)
139
+ i += 1
140
+ }
141
+ }
142
+
143
+ each(body: T => Unit): Unit {
144
+ mutable i = 0
145
+ while {i < self.size()} {
146
+ body(self!->array.get(i)?)
147
+ i += 1
148
+ }
149
+ }
150
+
151
+ eachWithIndex(body: (Int, T) => Unit): Unit {
152
+ mutable i = 0
153
+ while {i < self.size()} {
154
+ body(i, self!->array.get(i)?)
155
+ i += 1
156
+ }
157
+ }
158
+
159
+ eachWhile(body: T => Bool): Unit {
160
+ mutable i = 0
161
+ while {i < self.size()} {
162
+ if(body(self!->array.get(i)?)) {
163
+ i += 1
164
+ } else {
165
+ i = self.size()
166
+ }
167
+ }
168
+ }
169
+
170
+ all(body: T => Bool): Bool {
171
+ mutable result = True
172
+ self.eachWhile {x =>
173
+ result = body(x)
174
+ result
175
+ }
176
+ result
177
+ }
178
+
179
+ any(body: T => Bool): Bool {
180
+ mutable result = False
181
+ self.eachWhile {x =>
182
+ result = body(x)
183
+ (!result)
184
+ }
185
+ result
186
+ }
187
+
188
+ find(body: T => Bool): Option[T] {
189
+ mutable result = None
190
+ self.eachWhile {x =>
191
+ if(body(x)) {
192
+ result = Some(x)
193
+ False
194
+ } else {
195
+ True
196
+ }
197
+ }
198
+ result
199
+ }
200
+
201
+ indexWhere(body: T => Bool): Option[Int] {
202
+ mutable i = -1
203
+ mutable result = False
204
+ self.eachWhile {x =>
205
+ i += 1
206
+ result = body(x)
207
+ (!result)
208
+ }
209
+ if(result) {i}
210
+ }
211
+
212
+ drain(): List[T] {
213
+ let result = self!->array
214
+ self!->array = []
215
+ result?
216
+ }
217
+
218
+ toList(start: Int = 0, end: Int = 9007199254740991): List[T] {
219
+ self!->array->slice(start, end)?
220
+ }
221
+
222
+ toStream(start: Int = 0, end: Int = 9007199254740991): Stream[T] {
223
+ self.toList(start, end).toStream()
224
+ }
225
+
226
+ reverse(): Unit {
227
+ self!->array->reverse()?
228
+ }
229
+
230
+ sortBy[S: Order](body: T => S): Unit {
231
+ self.sortWith {Ordering.compare(body(_), body(_))}
232
+ }
233
+
234
+ sortWith(ordering: (T, T) => Ordering): Unit {
235
+ if(Js.inAsync()) {
236
+ sortRange(self, ordering, 0, self.size())
237
+ } else {
238
+ self!->array->sort(Js->{x, y => ordering(x?, y?).toInt()})
239
+ }
240
+ }
241
+
242
+ }
243
+
244
+ extend self[T: Order]: Array[T] {
245
+
246
+ sort(): Unit {
247
+ self.sortWith(Ordering.compare)
248
+ }
249
+
250
+ }
251
+
252
+ extend self: Array[String] {
253
+
254
+ join(separator: String = ""): String {
255
+ self!->array->join(separator)?
256
+ }
257
+
258
+ }
259
+
260
+ instance Array[T: Show]: Show {
261
+ show(value: Array[T]): String {
262
+ let array = Array.new()
263
+ array.push("[")
264
+ value.each {x =>
265
+ if(array.size() > 1) {array.push(", ")}
266
+ array.push(Show.show(x))
267
+ }
268
+ array.push("].toArray()")
269
+ array.join()
270
+ }
271
+ }
272
+
273
+ sortRange[T](array: Array[T], compare: (T, T) => Ordering, start: Int, end: Int): Unit {
274
+ if(end - start < 2) {} else:
275
+
276
+ mutable middle = start + (end - start).div(2)
277
+ sortRange(array, compare, start, middle)
278
+ sortRange(array, compare, middle, end)
279
+
280
+ mutable i = start
281
+ mutable j = middle
282
+ while {i < middle && j < end} {
283
+ if(compare(array.grab(i), array.grab(j)) != OrderingAfter) {
284
+ i += 1
285
+ } else {
286
+ let value = array.grab(j)
287
+ mutable k = j
288
+ while {k > i} {
289
+ array.set(k, array.grab(k - 1))
290
+ k -= 1
291
+ }
292
+ array.set(i, value)
293
+ i += 1
294
+ middle += 1
295
+ j += 1
296
+ }
297
+ }
298
+ }