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/Atomic.ff CHANGED
@@ -1,64 +1,63 @@
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
+ Js->(value = value!)?
5
+ }
6
+
7
+ extend self[T]: Atomic[T] {
8
+
9
+ modify(body: T => T): T {
10
+ if(Js.inAsync()) {
11
+ mutable currentValue = self!->value
12
+ mutable newValue = body(self!->value?)
13
+ while {currentValue !== self!->value} {
14
+ currentValue = self!->value
15
+ newValue = body(self!->value?)
16
+ }
17
+ self!->value = newValue!
18
+ newValue
19
+ } else {
20
+ let newValue = body(self!->value?)
21
+ self!->value = newValue!
22
+ newValue
23
+ }
24
+ }
25
+
26
+ getAndModify(body: T => T): T {
27
+ mutable currentValue = self!->value
28
+ if(Js.inAsync()) {
29
+ mutable newValue = body(self!->value?)
30
+ while {currentValue !== self!->value} {
31
+ currentValue = self!->value
32
+ newValue = body(self!->value?)
33
+ }
34
+ self!->value = newValue!
35
+ currentValue?
36
+ } else {
37
+ let newValue = body(self!->value?)
38
+ self!->value = newValue!
39
+ currentValue?
40
+ }
41
+ }
42
+
43
+ get(): T {
44
+ self!->value?
45
+ }
46
+
47
+ set(value: T): Unit {
48
+ self!->value = value!
49
+ }
50
+
51
+ getAndSet(newValue: T): T {
52
+ let currentValue = self!->value
53
+ self!->value = newValue!
54
+ currentValue?
55
+ }
56
+
57
+ compareAndSet(currentValue: T, newValue: T): Bool {
58
+ if(self!->value !== currentValue!) {False} else:
59
+ self!->value = newValue!
60
+ True
61
+ }
62
+
63
+ }
package/core/Box.ff CHANGED
@@ -1,7 +1,7 @@
1
- class Box[T](mutable value: T)
2
-
3
- extend self[T]: Box[T] {
4
- modify(body: T => T): Unit {
5
- self.value = body(self.value)
6
- }
7
- }
1
+ class Box[T](mutable value: T)
2
+
3
+ extend self[T]: Box[T] {
4
+ modify(body: T => T): Unit {
5
+ self.value = body(self.value)
6
+ }
7
+ }
@@ -1,40 +1,40 @@
1
- capability BrowserSystem {}
2
-
3
- extend self: BrowserSystem {
4
-
5
- httpClient(): HttpClient
6
- target js async "return typeof globalThis !== 'undefined' ? globalThis : window"
7
-
8
- mainTask(): Task
9
- target js async "return self_.task_"
10
-
11
- crypto(): Crypto
12
- target js async "return (typeof globalThis !== 'undefined' ? globalThis : window).crypto"
13
-
14
- js(): JsSystem
15
- target js async "return typeof globalThis !== 'undefined' ? globalThis : window"
16
-
17
- url(): String
18
- target js async """
19
- return location.href;
20
- """
21
-
22
- urlPath(): String
23
- target js async """
24
- return location.pathname;
25
- """
26
-
27
- urlQuery(name: String): Option[String]
28
- target js async """
29
- const param = new URLSearchParams(location.search).get(name_)
30
- if(param == null) return ff_core_Option.None();
31
- return ff_core_Option.Some(param);
32
- """
33
-
34
- urlFragment(): Option[String]
35
- target js async """
36
- if(!location.hash.startsWith('#')) return ff_core_Option.None();
37
- return ff_core_Option.Some(location.hash.slice(1));
38
- """
39
-
40
- }
1
+ capability BrowserSystem {}
2
+
3
+ extend self: BrowserSystem {
4
+
5
+ httpClient(): HttpClient {
6
+ Js.globalThis()?
7
+ }
8
+
9
+ mainTask(): Task {
10
+ self!->"task_"?
11
+ }
12
+
13
+ crypto(): Crypto {
14
+ Js->crypto?
15
+ }
16
+
17
+ js(): JsSystem {
18
+ Js.globalThis()?
19
+ }
20
+
21
+ url(): String {
22
+ Js->location->href?
23
+ }
24
+
25
+ urlPath(): String {
26
+ Js->location->pathname?
27
+ }
28
+
29
+ urlQuery(name: String): Option[String] {
30
+ let param = Js->URLSearchParams->(Js->location->search)->get(name)
31
+ if(param.isNullOrUndefined()) {None} else:
32
+ Some(param?)
33
+ }
34
+
35
+ urlFragment(): Option[String] {
36
+ if(!Js->location->hash->startsWith("#")?) {None} else:
37
+ Some(Js->location->hash->slice(1)?)
38
+ }
39
+
40
+ }
package/core/Buffer.ff CHANGED
@@ -1,7 +1,8 @@
1
1
  class Buffer {}
2
2
 
3
- new(size: Int, shared: Bool = False): Buffer
4
- target js sync "return new DataView(shared_ ? new SharedArrayBuffer(size_) : new ArrayBuffer(size_))"
3
+ new(size: Int, shared: Bool = False): Buffer {
4
+ Js->DataView->(if(shared) {Js->SharedArrayBuffer->(size)} else {Js->ArrayBuffer->(size)})?
5
+ }
5
6
 
6
7
  extend self: Buffer {
7
8
 
@@ -11,47 +12,57 @@ extend self: Buffer {
11
12
  /*grabBigUint64(byteOffset: Int, littleEndian: Bool = True): BigInt
12
13
  target js sync "return self_.getBigUint64(byteOffset_, littleEndian_)"*/
13
14
 
14
- grabUint64(byteOffset: Int, littleEndian: Bool = True): Int
15
- target js sync """
16
- const high = self_.getUint32(byteOffset_ + (littleEndian_ ? 4 : 0), littleEndian_)
17
- const low = self_.getUint32(byteOffset_ + (littleEndian_ ? 0 : 4), littleEndian_)
18
- const result = (high * 0x100000000) + low
19
- if(!Number.isSafeInteger(result)) throw 'grabUint64 out of range (consider grabBigUint64)'
20
- return result
21
- """
22
-
23
- grabInt64(byteOffset: Int, littleEndian: Bool = True): Int
24
- target js sync """
25
- const high = self_.getInt32(byteOffset_ + (littleEndian_ ? 4 : 0), littleEndian_)
26
- const low = self_.getUint32(byteOffset_ + (littleEndian_ ? 0 : 4), littleEndian_)
27
- const result = (high * 0x100000000) + low
28
- if(!Number.isSafeInteger(result)) throw 'grabInt64 out of range (consider grabBigInt64)'
29
- return result
30
- """
31
-
32
- grabFloat32(byteOffset: Int, littleEndian: Bool = True): Float
33
- target js sync "return self_.getFloat32(byteOffset_, littleEndian_)"
15
+ grabUint64(byteOffset: Int, littleEndian: Bool = True): Int {
16
+ let high = self!->getUint32(byteOffset + if(littleEndian) {4} else {0}, littleEndian)
17
+ let low = self!->getUint32(byteOffset + if(littleEndian) {0} else {4}, littleEndian)
18
+ let result = (high? * 0x100000000) + low?
19
+ if(!Js->Number->isSafeInteger(result)?) {
20
+ throw(GrabException)
21
+ }
22
+ result
23
+ }
24
+
25
+ grabInt64(byteOffset: Int, littleEndian: Bool = True): Int {
26
+ let high = self!->getInt32(byteOffset + if(littleEndian) {4} else {0}, littleEndian)
27
+ let low = self!->getUint32(byteOffset + if(littleEndian) {0} else {4}, littleEndian)
28
+ let result = (high? * 0x100000000) + low?
29
+ if(!Js->Number->isSafeInteger(result)?) {
30
+ throw(GrabException()) //grabInt64 out of range (consider grabBigInt64)'
31
+ }
32
+ result
33
+ }
34
34
 
35
- grabFloat64(byteOffset: Int, littleEndian: Bool = True): Float
36
- target js sync "return self_.getFloat64(byteOffset_, littleEndian_)"
35
+ grabFloat32(byteOffset: Int, littleEndian: Bool = True): Float {
36
+ self!->getFloat32(byteOffset, littleEndian)?
37
+ }
38
+
39
+ grabFloat64(byteOffset: Int, littleEndian: Bool = True): Float {
40
+ self!->getFloat64(byteOffset, littleEndian)?
41
+ }
37
42
 
38
- grabInt16(byteOffset: Int, littleEndian: Bool = True): Int
39
- target js sync "return self_.getInt16(byteOffset_, littleEndian_)"
43
+ grabInt16(byteOffset: Int, littleEndian: Bool = True): Int {
44
+ self!->getInt16(byteOffset, littleEndian)?
45
+ }
40
46
 
41
- grabInt32(byteOffset: Int, littleEndian: Bool = True): Int
42
- target js sync "return self_.getInt32(byteOffset_, littleEndian_)"
47
+ grabInt32(byteOffset: Int, littleEndian: Bool = True): Int {
48
+ self!->getInt32(byteOffset, littleEndian)?
49
+ }
43
50
 
44
- grabInt8(byteOffset: Int): Int
45
- target js sync "return self_.getInt8(byteOffset_)"
51
+ grabInt8(byteOffset: Int): Int {
52
+ self!->getInt8(byteOffset)?
53
+ }
46
54
 
47
- grabUint16(byteOffset: Int, littleEndian: Bool = True): Int
48
- target js sync "return self_.getUint16(byteOffset_, littleEndian_)"
55
+ grabUint16(byteOffset: Int, littleEndian: Bool = True): Int {
56
+ self!->getUint16(byteOffset, littleEndian)?
57
+ }
49
58
 
50
- grabUint32(byteOffset: Int, littleEndian: Bool = True): Int
51
- target js sync "return self_.getUint32(byteOffset_, littleEndian_)"
59
+ grabUint32(byteOffset: Int, littleEndian: Bool = True): Int {
60
+ self!->getUint32(byteOffset, littleEndian)?
61
+ }
52
62
 
53
- grabUint8(byteOffset: Int): Int
54
- target js sync "return self_.getUint8(byteOffset_)"
63
+ grabUint8(byteOffset: Int): Int {
64
+ self!->getUint8(byteOffset)?
65
+ }
55
66
 
56
67
  /*setBigInt64(byteOffset: Int, value: BigInt, littleEndian: Bool = False): Unit
57
68
  target js sync "self_.setBigInt64(byteOffset_, value_, littleEndian_)"*/
@@ -59,121 +70,132 @@ extend self: Buffer {
59
70
  /*setBigUint64(byteOffset: Int, value: BigInt, littleEndian: Bool = False): Unit
60
71
  target js sync "self_.setBigUint64(byteOffset_, value_, littleEndian_)"*/
61
72
 
62
- setUint64(byteOffset: Int, value: Int, littleEndian: Bool = True): Int
63
- target js sync """
64
- self_.setUint32(byteOffset_ + (littleEndian_ ? 4 : 0), (value_ >>> 16) >>> 16, littleEndian_)
65
- self_.setUint32(byteOffset_ + (littleEndian_ ? 0 : 4), value_ & 0xffffffff, littleEndian_)
66
- """
67
-
68
- setInt64(byteOffset: Int, value: Int, littleEndian: Bool = True): Int
69
- target js sync """
70
- self_.setUint32(byteOffset_ + (littleEndian_ ? 4 : 0), (value_ >> 16) >> 16, littleEndian_)
71
- self_.setUint32(byteOffset_ + (littleEndian_ ? 0 : 4), value_ & 0xffffffff, littleEndian_)
72
- """
73
+ setUint64(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit {
74
+ self!->setUint32(byteOffset + if(littleEndian) {4} else {0}, value.bitRightUnsigned(16).bitRightUnsigned(16), littleEndian)
75
+ self!->setUint32(byteOffset + if(littleEndian) {0} else {4}, value.bitAnd(0xffffffff), littleEndian)
76
+ }
77
+
78
+ setInt64(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit {
79
+ self!->setUint32(byteOffset + if(littleEndian) {4} else {0}, value.bitRight(16).bitRight(16), littleEndian)
80
+ self!->setUint32(byteOffset + if(littleEndian) {0} else {4}, value.bitAnd(0xffffffff), littleEndian)
81
+ }
73
82
 
74
- setFloat32(byteOffset: Int, value: Float, littleEndian: Bool = True): Unit
75
- target js sync "self_.setFloat32(byteOffset_, value_, littleEndian_)"
83
+ setFloat32(byteOffset: Int, value: Float, littleEndian: Bool = True): Unit {
84
+ self!->setFloat32(byteOffset, value, littleEndian)
85
+ }
76
86
 
77
- setFloat64(byteOffset: Int, value: Float, littleEndian: Bool = True): Unit
78
- target js sync "self_.setFloat64(byteOffset_, value_, littleEndian_)"
87
+ setFloat64(byteOffset: Int, value: Float, littleEndian: Bool = True): Unit {
88
+ self!->setFloat64(byteOffset, value, littleEndian)
89
+ }
79
90
 
80
- setInt16(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit
81
- target js sync "self_.setInt16(byteOffset_, value_, littleEndian_)"
91
+ setInt16(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit {
92
+ self!->setInt16(byteOffset, value, littleEndian)
93
+ }
82
94
 
83
- setInt32(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit
84
- target js sync "self_.setInt32(byteOffset_, value_, littleEndian_)"
95
+ setInt32(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit {
96
+ self!->setInt32(byteOffset, value, littleEndian)
97
+ }
85
98
 
86
- setInt8(byteOffset: Int, value: Int): Unit
87
- target js sync "self_.setInt8(byteOffset_, value_)"
99
+ setInt8(byteOffset: Int, value: Int): Unit {
100
+ self!->setInt8(byteOffset, value)
101
+ }
88
102
 
89
- setUint16(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit
90
- target js sync "self_.setUint16(byteOffset_, value_, littleEndian_)"
103
+ setUint16(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit {
104
+ self!->setUint16(byteOffset, value, littleEndian)
105
+ }
91
106
 
92
- setUint32(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit
93
- target js sync "self_.setUint32(byteOffset_, value_, littleEndian_)"
107
+ setUint32(byteOffset: Int, value: Int, littleEndian: Bool = True): Unit {
108
+ self!->setUint32(byteOffset, value, littleEndian)
109
+ }
94
110
 
95
- setUint8(byteOffset: Int, value: Int): Unit
96
- target js sync "self_.setUint8(byteOffset_, value_)"
111
+ setUint8(byteOffset: Int, value: Int): Unit {
112
+ self!->setUint8(byteOffset, value)
113
+ }
97
114
 
98
- setAll(byteOffset: Int, buffer: Buffer): Unit
99
- target js sync """
100
- const sourceBuffer = new Uint8Array(buffer_.buffer, buffer_.byteOffset, buffer_.byteLength)
101
- const targetBuffer = new Uint8Array(self_.buffer, self_.byteOffset, self_.byteLength)
102
- targetBuffer.set(sourceBuffer, byteOffset_)
103
- """
115
+ setAll(byteOffset: Int, buffer: Buffer): Unit {
116
+ let sourceBuffer = Js->Uint8Array->(buffer!->buffer, buffer!->byteOffset, buffer!->byteLength)
117
+ let targetBuffer = Js->Uint8Array->(self!->buffer, self!->byteOffset, self!->byteLength)
118
+ targetBuffer->set(sourceBuffer, byteOffset)
119
+ }
104
120
 
105
- size(): Int
106
- target js sync "return self_.byteLength"
121
+ size(): Int {
122
+ self!->byteLength?
123
+ }
107
124
 
108
- shared(): Bool
109
- target js sync "return typeof SharedArrayBuffer !== 'undefined' && self_.buffer instanceof SharedArrayBuffer"
125
+ shared(): Bool {
126
+ Js->SharedArrayBuffer.typeof() != "undefined" && self!->buffer.instanceof(Js->SharedArrayBuffer)
127
+ }
110
128
 
111
- view(begin: Int, end: Int): Buffer
112
- target js sync "return new DataView(self_.buffer, self_.byteOffset + begin_, end_ - begin_)"
129
+ view(begin: Int, end: Int): Buffer {
130
+ Js->DataView->(self!->buffer, self!->byteOffset + begin!, end - begin)?
131
+ }
113
132
 
114
- copy(): Buffer
115
- target js sync "return new DataView(self_.buffer.slice(self_.byteOffset, self_.byteOffset + self_.byteLength))"
133
+ copy(): Buffer {
134
+ Js->DataView->(self!->buffer->slice(self!->byteOffset, self!->byteOffset + self!->byteLength))?
135
+ }
116
136
 
117
- toString(encoding: String = "utf8"): String
118
- target js sync """
119
- if(encoding_ === "utf8") {
120
- if(typeof TextDecoder.ffSingleton === 'undefined') TextDecoder.ffSingleton = new TextDecoder()
121
- return TextDecoder.ffSingleton.decode(self_)
137
+ toString(encoding: String = "utf8"): String {
138
+ if(encoding == "utf8") {
139
+ if(Js->TextDecoder->ffSingleton.typeof() == "undefined") {
140
+ Js->TextDecoder->ffSingleton = Js->TextDecoder->()
122
141
  }
123
- return new TextDecoder().decode(self_)
124
- """
142
+ Js->TextDecoder->ffSingleton->decode(self!)?
143
+ }
144
+ Js->TextDecoder->()->decode(self!)?
145
+ }
125
146
 
126
- toByteArray(): List[Int]
127
- target js sync "return [...new Uint8Array(self_.buffer, self_.byteOffset, self_.byteLength)]"
147
+ toByteArray(): List[Int] {
148
+ Js->Uint8Array->(self!->buffer, self!->byteOffset, self!->byteLength).spreadToArray()!?
149
+ }
150
+
151
+ toHex(): String {
152
+ mutable hex = ""
153
+ 0.until(self!->byteLength?).each {i =>
154
+ hex = hex + self!->getUint8(i)->toString(16)->padStart(2, "0")?
155
+ }
156
+ hex
157
+ }
158
+
159
+ toBase64(): String {
160
+ let view = Js->Uint8Array->(self!->buffer, self!->byteOffset, self!->byteLength)
161
+ let binaryString = Js->TextDecoder->("latin1")->decode(view)
162
+ Js->btoa(binaryString)?
163
+ }
128
164
 
129
- toHex(): String
130
- target js sync """
131
- let hex = ''
132
- for (let i = 0; i < self_.byteLength; i++) {
133
- hex += self_.getUint8(i).toString(16).padStart(2, '0')
134
- }
135
- return hex
136
- """
165
+ }
137
166
 
138
- toBase64(): String
139
- target js sync """
140
- const view = new Uint8Array(self_.buffer, self_.byteOffset, self_.byteLength);
141
- return btoa(String.fromCharCode(...view));
142
- """
167
+ fromByteList(array: List[Int]): Buffer {
168
+ Js->DataView->(Js->Uint8Array(array)->buffer)?
169
+ }
143
170
 
171
+ fromBufferList(array: List[Buffer]): Buffer {
172
+ mutable length = 0
173
+ array.each {length += _!->byteLength?}
174
+ let arrayBuffer = Js->ArrayBuffer->(length)
175
+ let result = Js->Uint8Array->(arrayBuffer)
176
+ mutable offset = 0
177
+ array.each {b =>
178
+ result->set(Js->Uint8Array->(b!->buffer, b!->byteOffset, b!->byteLength), offset)
179
+ offset += b!->byteLength?
180
+ }
181
+ Js->DataView->(arrayBuffer)?
144
182
  }
145
183
 
146
- fromByteList(array: List[Int]): Buffer
147
- target js sync "return new DataView(new Uint8Array(array_).buffer)"
148
-
149
- fromBufferList(array: List[Buffer]): Buffer
150
- target js sync """
151
- let length = 0
152
- for(let b of array_) length += b.byteLength
153
- const arrayBuffer = new ArrayBuffer(length);
154
- const result = new Uint8Array(arrayBuffer)
155
- let offset = 0
156
- for(let b of array_) {
157
- result.set(new Uint8Array(b.buffer, b.byteOffset, b.byteLength), offset)
158
- offset += b.byteLength
159
- }
160
- return new DataView(arrayBuffer)
161
- """
162
-
163
- fromHex(hex: String): Buffer
164
- target js sync """
165
- const hexValues = hex_.match(/.{1,2}/g) || []
166
- const numbers = hexValues.map(value => parseInt(value, 16))
167
- return new DataView(new Uint8Array(numbers).buffer)
168
- """
169
-
170
- fromBase64(base64: String): Buffer
171
- target js sync """
172
- const binaryString = atob(base64_)
173
- const dataView = new DataView(new ArrayBuffer(binaryString.length))
174
- dataView.setUint8(binaryString.split('').map(char => char.charCodeAt(0)))
175
- return dataView
176
- """
184
+ fromHex(hex: String): Buffer {
185
+ let byteCount = (hex.size() * 0.5).ceil().toInt()
186
+ let arrayBuffer = Js->ArrayBuffer->(byteCount)
187
+ let result = Js->Uint8Array->(arrayBuffer)
188
+ 0.until(byteCount).each {i =>
189
+ result.set(i, Js->parseInt(hex!->slice(i * 2, i * 2 + 2), 16))
190
+ }
191
+ Js->DataView->(arrayBuffer)?
192
+ }
193
+
194
+ fromBase64(base64: String): Buffer {
195
+ let binaryString = Js->atob(base64)
196
+ let bytes = Js->Uint8Array->from(binaryString, Js->{char => char->CharCodeAt(0)})
197
+ Js->DataView->(bytes->buffer)?
198
+ }
177
199
 
178
200
  instance Buffer: Show {
179
201
  show(value: Buffer): String {
@@ -182,30 +204,41 @@ instance Buffer: Show {
182
204
  }
183
205
 
184
206
  instance Buffer: Equal {
185
- equals(x: Buffer, y: Buffer): Bool
186
- target js sync """
187
- if(x_.buffer.byteLength !== y_.buffer.byteLength) return false
188
- if(x_.buffer === y_.buffer) return true
189
- for(let i = 0; i + 4 <= x_.buffer.byteLength; i += 4) {
190
- if(x_.getInt32(i) !== y_.getInt32(i)) return false
191
- }
192
- for(; i < x_.buffer.byteLength; i++) {
193
- if(x_.getUint8(i) !== y_.getUint8(i)) return false
194
- }
195
- return true
196
- """
207
+ equals(x: Buffer, y: Buffer): Bool {
208
+ if(x.size() != y.size()) {False} else:
209
+ if(x! === y!) {True} else:
210
+ mutable i = 0
211
+ mutable same = True
212
+ while {i + 4 < x.size() && same} {
213
+ same = x!->getInt32(i) === y!->getInt32(i)
214
+ i += 4
215
+ }
216
+ if(!same) {False} else:
217
+ i.until(x.size()).eachWhile {i =>
218
+ same = x!->getUint8(i) === y!->getUint8(i)
219
+ same
220
+ }
221
+ same
222
+ }
197
223
  }
198
224
 
199
225
  instance Buffer: Order {
200
- compare(x: Buffer, y: Buffer): Ordering
201
- target js sync """
202
- if(x_.buffer === y_.buffer) return ff_core_Ordering.OrderingSame()
203
- const minLength = Math.min(x_.buffer.byteLength, y_.buffer.byteLength)
204
- for(let i = 0; i < minLength; i++) {
205
- if(x_.getUint8(i) !== y_.getUint8(i)) {
206
- return ff_core_Ordering.fromInt_(x_.getUint8(i) - y_.getUint8(i))
207
- }
226
+ compare(x: Buffer, y: Buffer): Ordering {
227
+ if(x!.equals(y!)) {OrderingSame} else:
228
+ let minLength = x.size().min(y.size())
229
+ mutable ordering = OrderingSame
230
+ 0.until(minLength).eachWhile {i =>
231
+ if(x!->getUint8(i) !== x!->getUint8(i)) {
232
+ ordering = Ordering.fromInt((x!->getUint8(i) - y!->getUint8(i))?)
233
+ False
234
+ } else {
235
+ True
208
236
  }
209
- return ff_core_Ordering.fromInt_(x_.buffer.byteLength - y_.buffer.byteLength)
210
- """
237
+ }
238
+ if(ordering == OrderingSame) {
239
+ Ordering.fromInt(x.size() - y.size())
240
+ } else {
241
+ ordering
242
+ }
243
+ }
211
244
  }