firefly-compiler 0.5.39 → 0.5.40

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 (129) hide show
  1. package/.hintrc +4 -4
  2. package/.vscode/settings.json +4 -4
  3. package/bin/Release.ff +157 -157
  4. package/bin/firefly.mjs +1 -1
  5. package/compiler/Builder.ff +275 -275
  6. package/compiler/Compiler.ff +234 -234
  7. package/compiler/Dependencies.ff +186 -186
  8. package/compiler/DependencyLock.ff +17 -17
  9. package/compiler/JsEmitter.ff +1437 -1437
  10. package/compiler/LspHook.ff +202 -202
  11. package/compiler/ModuleCache.ff +178 -178
  12. package/compiler/Workspace.ff +88 -88
  13. package/core/.firefly/include/package.json +5 -5
  14. package/core/.firefly/package.ff +2 -2
  15. package/core/Any.ff +25 -25
  16. package/core/Array.ff +298 -298
  17. package/core/Atomic.ff +63 -63
  18. package/core/Box.ff +7 -7
  19. package/core/BrowserSystem.ff +40 -40
  20. package/core/BuildSystem.ff +156 -156
  21. package/core/Crypto.ff +94 -94
  22. package/core/Equal.ff +41 -41
  23. package/core/Error.ff +25 -25
  24. package/core/HttpClient.ff +142 -142
  25. package/core/Instant.ff +24 -24
  26. package/core/Js.ff +305 -305
  27. package/core/JsSystem.ff +135 -135
  28. package/core/Json.ff +423 -423
  29. package/core/List.ff +482 -482
  30. package/core/Lock.ff +108 -108
  31. package/core/NodeSystem.ff +198 -198
  32. package/core/Ordering.ff +160 -160
  33. package/core/Path.ff +377 -378
  34. package/core/Queue.ff +90 -90
  35. package/core/Random.ff +140 -140
  36. package/core/RbMap.ff +216 -216
  37. package/core/Show.ff +44 -44
  38. package/core/SourceLocation.ff +68 -68
  39. package/core/Task.ff +165 -165
  40. package/experimental/benchmarks/ListGrab.ff +23 -23
  41. package/experimental/benchmarks/ListGrab.java +55 -55
  42. package/experimental/benchmarks/Pyrotek45.ff +30 -30
  43. package/experimental/benchmarks/Pyrotek45.java +64 -64
  44. package/experimental/bidirectional/Bidi.ff +88 -88
  45. package/experimental/lines/Main.ff +40 -40
  46. package/experimental/random/Index.ff +53 -53
  47. package/experimental/random/Process.ff +120 -120
  48. package/experimental/random/RunLength.ff +65 -65
  49. package/experimental/random/Scrape.ff +51 -51
  50. package/experimental/random/Symbols.ff +73 -73
  51. package/experimental/random/Tensor.ff +52 -52
  52. package/experimental/random/Units.ff +36 -36
  53. package/experimental/s3/S3TestAuthorizationHeader.ff +39 -39
  54. package/experimental/s3/S3TestPut.ff +16 -16
  55. package/experimental/tests/TestJson.ff +26 -26
  56. package/firefly.sh +0 -0
  57. package/fireflysite/.firefly/package.ff +4 -4
  58. package/fireflysite/CommunityOverview.ff +20 -20
  59. package/fireflysite/CountingButtonDemo.ff +58 -58
  60. package/fireflysite/DocumentParser.ff +325 -325
  61. package/fireflysite/ExamplesOverview.ff +40 -40
  62. package/fireflysite/FrontPage.ff +344 -344
  63. package/fireflysite/GettingStarted.ff +45 -45
  64. package/fireflysite/Guide.ff +456 -456
  65. package/fireflysite/Main.ff +163 -163
  66. package/fireflysite/MatchingPasswordsDemo.ff +82 -82
  67. package/fireflysite/PackagesOverview.ff +49 -49
  68. package/fireflysite/PostgresqlDemo.ff +34 -34
  69. package/fireflysite/ReferenceAll.ff +18 -18
  70. package/fireflysite/ReferenceIntroduction.ff +11 -11
  71. package/fireflysite/Styles.ff +567 -567
  72. package/fireflysite/Test.ff +121 -121
  73. package/fireflysite/assets/markdown/reference/BaseTypes.md +209 -209
  74. package/fireflysite/assets/markdown/reference/EmittedJavascript.md +65 -65
  75. package/fireflysite/assets/markdown/reference/Exceptions.md +101 -101
  76. package/fireflysite/assets/markdown/reference/FunctionsAndMethods.md +364 -364
  77. package/fireflysite/assets/markdown/reference/JavascriptInterop.md +235 -235
  78. package/fireflysite/assets/markdown/reference/ModulesAndPackages.md +162 -162
  79. package/fireflysite/assets/markdown/reference/OldStructuredConcurrency.md +48 -48
  80. package/fireflysite/assets/markdown/reference/PatternMatching.md +224 -224
  81. package/fireflysite/assets/markdown/reference/StatementsAndExpressions.md +86 -86
  82. package/fireflysite/assets/markdown/reference/StructuredConcurrency.md +99 -99
  83. package/fireflysite/assets/markdown/reference/TraitsAndInstances.md +100 -100
  84. package/fireflysite/assets/markdown/reference/UserDefinedTypes.md +184 -184
  85. package/fireflysite/assets/markdown/scratch/ControlFlow.md +136 -136
  86. package/fireflysite/assets/markdown/scratch/Toc.md +40 -40
  87. package/lsp/.firefly/package.ff +1 -1
  88. package/lsp/CompletionHandler.ff +827 -827
  89. package/lsp/Handler.ff +714 -714
  90. package/lsp/HoverHandler.ff +79 -79
  91. package/lsp/LanguageServer.ff +272 -272
  92. package/lsp/SignatureHelpHandler.ff +55 -55
  93. package/lsp/SymbolHandler.ff +181 -181
  94. package/lsp/TestReferences.ff +17 -17
  95. package/lsp/TestReferencesCase.ff +7 -7
  96. package/lsp/stderr.txt +1 -1
  97. package/lsp/stdout.txt +34 -34
  98. package/lux/.firefly/package.ff +1 -1
  99. package/lux/Css.ff +648 -648
  100. package/lux/CssTest.ff +48 -48
  101. package/lux/Lux.ff +608 -608
  102. package/lux/LuxEvent.ff +79 -79
  103. package/lux/Main.ff +123 -123
  104. package/lux/Main2.ff +143 -143
  105. package/lux/TestDry.ff +28 -28
  106. package/output/js/ff/compiler/Builder.mjs +36 -36
  107. package/output/js/ff/core/Path.mjs +0 -2
  108. package/package.json +1 -1
  109. package/rpc/.firefly/package.ff +1 -1
  110. package/rpc/Rpc.ff +70 -70
  111. package/s3/.firefly/package.ff +1 -1
  112. package/s3/S3.ff +92 -92
  113. package/vscode/LICENSE.txt +21 -21
  114. package/vscode/Prepublish.ff +15 -15
  115. package/vscode/README.md +16 -16
  116. package/vscode/client/package-lock.json +544 -544
  117. package/vscode/client/package.json +22 -22
  118. package/vscode/client/src/extension.ts +104 -104
  119. package/vscode/icons/firefly-icon.svg +10 -10
  120. package/vscode/language-configuration.json +61 -61
  121. package/vscode/package-lock.json +3623 -3623
  122. package/vscode/package.json +1 -1
  123. package/vscode/snippets.json +241 -241
  124. package/vscode/syntaxes/firefly-markdown-injection.json +45 -45
  125. package/webserver/.firefly/include/package.json +5 -5
  126. package/webserver/.firefly/package.ff +2 -2
  127. package/webserver/WebServer.ff +647 -647
  128. package/websocket/.firefly/package.ff +1 -1
  129. package/websocket/WebSocket.ff +100 -100
package/core/Array.ff CHANGED
@@ -1,298 +1,298 @@
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
- }
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
+ }