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/JsValue.ff CHANGED
@@ -2,243 +2,387 @@ class JsValue {}
2
2
 
3
3
  extend self: JsValue {
4
4
 
5
- grabString(): String
6
- target js sync "return self_"
5
+ grabString(): String {
6
+ if(!self.isString()) {throw(GrabException)}
7
+ self?
8
+ }
7
9
 
8
- grabChar(): Char
9
- target js sync "return self_"
10
+ grabChar(): Char {
11
+ if(!self.isChar()) {throw(GrabException)}
12
+ self?
13
+ }
10
14
 
11
- grabInt(): Int
12
- target js sync "return self_"
15
+ grabInt(): Int {
16
+ if(!self.isInt()) {throw(GrabException)}
17
+ self?
18
+ }
13
19
 
14
- grabFloat(): Float
15
- target js sync "return self_"
20
+ grabFloat(): Float {
21
+ if(!self.isFloat()) {throw(GrabException)}
22
+ self?
23
+ }
16
24
 
17
- grabBool(): Bool
18
- target js sync "return self_"
25
+ grabBool(): Bool {
26
+ if(!self.isBool()) {throw(GrabException)}
27
+ self?
28
+ }
19
29
 
20
- grabArray(): List[JsValue]
21
- target js sync "return self_"
30
+ grabArray(): List[JsValue] {
31
+ if(!self.isArray()) {throw(GrabException)}
32
+ self?
33
+ }
22
34
 
23
- grabBuffer(): Buffer
24
- target js sync """
25
- if(!(self_ instanceof DataView)) throw new Error('Expected buffer, got '+ typeof self_);
26
- return self_
27
- """
35
+ grabBuffer(): Buffer {
36
+ if(!self.isBuffer()) {throw(GrabException)}
37
+ self?
38
+ }
28
39
 
29
- grabJson(): Json
30
- target js sync """
31
- return self_
32
- """
33
-
34
- equals[V: IsJsValue](value: V): Bool
35
- target js sync "return self_ === value_"
40
+ grabJson(): Json {
41
+ self? // Should check first
42
+ }
36
43
 
37
- isString(): Bool
38
- target js sync "return typeof self_ === 'string'"
44
+ equals[V: IsJsValue](value: V): Bool {
45
+ self === value
46
+ }
39
47
 
40
- isChar(): Bool
41
- target js sync """
42
- return Number.isInteger(self_) && Math.abs(self_) <= Number.MAX_SAFE_INTEGER
43
- && self_ >= 0 && self_ < 1114112
44
- """
48
+ notEquals[V: IsJsValue](value: V): Bool {
49
+ self !== value
50
+ }
45
51
 
46
- isInt(): Bool
47
- target js sync "return Number.isInteger(self_) && Math.abs(self_) <= Number.MAX_SAFE_INTEGER"
52
+ isString(): Bool {
53
+ self.typeof() == "string"
54
+ }
55
+
56
+ isChar(): Bool {
57
+ Js->Number->isInteger(self)? &&
58
+ Js->Math->abs(self)? <= Js->Number->"MAX_SAFE_INTEGER"? &&
59
+ self? >= 0 &&
60
+ self? < 1114112
61
+ }
62
+
63
+ isInt(): Bool {
64
+ Js->Number->isInteger(self)? &&
65
+ Js->Math->abs(self)? <= Js->Number->"MAX_SAFE_INTEGER"?
66
+ }
48
67
 
49
- isFloat(): Bool
50
- target js sync "return typeof self_ === 'number'"
68
+ isFloat(): Bool {
69
+ self.typeof() == "number"
70
+ }
51
71
 
52
- isBool(): Bool
53
- target js sync "return typeof self_ === 'boolean'"
72
+ isBool(): Bool {
73
+ self.typeof() == "boolean"
74
+ }
54
75
 
55
- isArray(): Bool
56
- target js sync "return Array.isArray(self_)"
76
+ isArray(): Bool {
77
+ Js->Array->isArray(self)?
78
+ }
57
79
 
58
- isObject(): Bool
59
- target js sync "return self_ != null && typeof self_ === 'object'"
80
+ isObject(): Bool {
81
+ !self.isNull() && self.typeof() == "object"
82
+ }
60
83
 
61
- isFunction(): Bool
62
- target js sync "return typeof self_ === 'function'"
63
-
64
- isNull(): Bool
65
- target js sync "return self_ === null"
84
+ isFunction(): Bool {
85
+ self.typeof() == "function"
86
+ }
87
+
88
+ isBuffer(): Bool {
89
+ self.instanceof(Js->DataView)
90
+ }
66
91
 
67
- isUndefined(): Bool
68
- target js sync "return typeof self_ === 'undefined'"
92
+ isNull(): Bool {
93
+ self === Js.null()
94
+ }
69
95
 
70
- isNullOrUndefined(): Bool
71
- target js sync "return self_ == null"
96
+ isUndefined(): Bool {
97
+ self === Js.undefined()
98
+ }
72
99
 
73
- isNan(): Bool
74
- target js sync "return typeof self_ === 'number' && self_ !== self_"
100
+ isNullOrUndefined(): Bool {
101
+ self.isNull() || self.isUndefined()
102
+ }
75
103
 
76
- isFinite(): Bool
77
- target js sync "return typeof self_ === 'number' && isFinite(self_)"
104
+ isNan(): Bool {
105
+ self.typeof() == "number" && self !== self
106
+ }
78
107
 
108
+ isFinite(): Bool {
109
+ self.typeof() == "number" && Js->isFinite(self)?
110
+ }
79
111
 
80
- get[K: IsJsValue](key: K): JsValue
81
- target js sync "return self_[key_]"
112
+ get[K: IsJsValue](key: K): JsValue {
113
+ // Special cased by the compiler
114
+ self.get(key)
115
+ }
82
116
 
83
- // TODO rename
84
117
  getOwn(key: String): Option[JsValue] {
85
118
  if(self.hasOwn(key)) {Some(self.get(key))} else {None}
86
119
  }
87
120
 
88
- set[K: IsJsValue, V: IsJsValue](key: K, value: V): Unit
89
- target js sync "self_[key_] = value_"
121
+ set[K: IsJsValue, V: IsJsValue](key: K, value: V): Unit {
122
+ // Special cased by the compiler
123
+ self.set(key, value)
124
+ }
90
125
 
91
- increment[K: IsJsValue, V: IsJsValue](key: K, value: V): Unit
92
- target js sync "self_[key_] += value_"
126
+ increment[K: IsJsValue, V: IsJsValue](key: K, value: V): Unit {
127
+ // Special cased by the compiler
128
+ self.increment(key, value)
129
+ }
93
130
 
94
- decrement[K: IsJsValue, V: IsJsValue](key: K, value: V): Unit
95
- target js sync "self_[key_] -= value_"
96
-
97
- delete[K: IsJsValue](key: K): Unit
98
- target js sync "delete self_[key_]"
131
+ decrement[K: IsJsValue, V: IsJsValue](key: K, value: V): Unit {
132
+ // Special cased by the compiler
133
+ self.decrement(key, value)
134
+ }
99
135
 
100
- with[K: IsJsValue, V: IsJsValue](key: K, value: V): JsValue
101
- target js sync "return {...self_, [key_]: value_}"
136
+ delete[K: IsJsValue](key: K): Unit {
137
+ // Special cased by the compiler
138
+ self.delete(key)
139
+ }
102
140
 
103
- hasOwn(name: String): Bool
104
- target js sync "return Object.prototype.hasOwnProperty.call(self_, name_)"
141
+ with[K: IsJsValue, V: IsJsValue](key: K, value: V): JsValue {
142
+ // Special cased by the compiler
143
+ self.with(key, value)
144
+ }
105
145
 
146
+ hasOwn(name: String): Bool {
147
+ Js->Object->prototype->hasOwnProperty->call(self, name)?
148
+ }
106
149
 
107
- assign(source: JsValue, source2: JsValue = source): JsValue
108
- target js sync "return Object.assign(self_, source_, source2_ !== source_ ? source2_ : null)"
109
150
 
151
+ assign(source: JsValue, source2: JsValue = source): JsValue {
152
+ Js->Object->assign(self, source, if(source2 !== source) {source2} else {Js.null()})?
153
+ }
110
154
 
111
- each(body: JsValue => Unit): Unit
112
- target js sync "for(const value of self_) body_(value)"
113
- target js async "for(const value of self_) await body_(value, $task)"
114
155
 
115
- eachWhile(body: JsValue => Bool): Unit
116
- target js sync "for(const value of self_) if(!body_(value)) break"
117
- target js async "for(const value of self_) if(!await body_(value, $task)) break"
156
+ each(body: JsValue => Unit): Unit {
157
+ let iterator = self.call0(Js->Symbol->iterator)
158
+ mutable result = iterator->next()
159
+ while {!result->done?} {
160
+ body(result->value)
161
+ result = iterator->next()
162
+ }
163
+ }
118
164
 
119
- call[A0: IsJsValue](name: A0, arguments: List[JsValue]): JsValue
120
- target js sync "return self_[name_].apply(this_, arguments_)"
165
+ eachWhile(body: JsValue => Bool): Unit {
166
+ let iterator = self.call0(Js->Symbol->iterator)
167
+ mutable result = iterator->next()
168
+ while {!result->done? && body(result->value)} {
169
+ result = iterator->next()
170
+ }
171
+ }
121
172
 
122
- call0[A0: IsJsValue](name: A0): JsValue
123
- target js sync "return self_[name_].call(self_)"
173
+ call[A0: IsJsValue](name: A0, arguments: List[JsValue]): JsValue {
174
+ self.get(name)->apply(self, arguments)
175
+ }
124
176
 
125
- call1[A0: IsJsValue, A1: IsJsValue](name: A0, a1: A1): JsValue
126
- target js sync "return self_[name_].call(self_, a1_)"
177
+ call0[A0: IsJsValue](name: A0): JsValue {
178
+ // Special cased by the compiler
179
+ self.call0(name)
180
+ }
127
181
 
128
- call2[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue](name: A0, a1: A1, a2: A2): JsValue
129
- target js sync "return self_[name_].call(self_, a1_, a2_)"
182
+ call1[A0: IsJsValue, A1: IsJsValue](name: A0, a1: A1): JsValue {
183
+ // Special cased by the compiler
184
+ self.call1(name, a1)
185
+ }
130
186
 
131
- call3[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3): JsValue
132
- target js sync "return self_[name_].call(self_, a1_, a2_, a3_)"
187
+ call2[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue](name: A0, a1: A1, a2: A2): JsValue {
188
+ // Special cased by the compiler
189
+ self.call2(name, a1, a2)
190
+ }
133
191
 
134
- call4[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4): JsValue
135
- target js sync "return self_[name_].call(self_, a1_, a2_, a3_, a4_)"
192
+ call3[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3): JsValue {
193
+ // Special cased by the compiler
194
+ self.call3(name, a1, a2, a3)
195
+ }
136
196
 
137
- call5[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): JsValue
138
- target js sync "return self_[name_].call(self_, a1_, a2_, a3_, a4_, a5_)"
197
+ call4[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4): JsValue {
198
+ // Special cased by the compiler
199
+ self.call4(name, a1, a2, a3, a4)
200
+ }
139
201
 
140
- call6[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): JsValue
141
- target js sync "return self_[name_].call(self_, a1_, a2_, a3_, a4_, a5_, a6_)"
202
+ call5[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): JsValue {
203
+ // Special cased by the compiler
204
+ self.call5(name, a1, a2, a3, a4, a5)
205
+ }
142
206
 
143
- call7[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): JsValue
144
- target js sync "return self_[name_].call(self_, a1_, a2_, a3_, a4_, a5_, a6_, a7_)"
207
+ call6[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): JsValue {
208
+ // Special cased by the compiler
209
+ self.call6(name, a1, a2, a3, a4, a5, a6)
210
+ }
145
211
 
146
- call8[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): JsValue
147
- target js sync "return self_[name_].call(self_, a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_)"
212
+ call7[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): JsValue {
213
+ // Special cased by the compiler
214
+ self.call7(name, a1, a2, a3, a4, a5, a6, a7)
215
+ }
148
216
 
149
- call9[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue, A9: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9): JsValue
150
- target js sync "return self_[name_].call(self_, a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_)"
217
+ call8[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): JsValue {
218
+ // Special cased by the compiler
219
+ self.call8(name, a1, a2, a3, a4, a5, a6, a7, a8)
220
+ }
151
221
 
222
+ call9[A0: IsJsValue, A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue, A9: IsJsValue](name: A0, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9): JsValue {
223
+ // Special cased by the compiler
224
+ self.call9(name, a1, a2, a3, a4, a5, a6, a7, a8, a9)
225
+ }
152
226
 
153
- callValue(this: JsValue, arguments: List[JsValue]): JsValue
154
- target js sync "return self_.apply(this_, arguments_)"
227
+ callValue(this: JsValue, arguments: List[JsValue]): JsValue {
228
+ self->apply(this, arguments)
229
+ }
155
230
 
156
- callValue0(): JsValue
157
- target js sync "return self_.call(void 0)"
231
+ callValue0(): JsValue {
232
+ // Special cased by the compiler
233
+ self.callValue0()
234
+ }
158
235
 
159
- callValue1[A1: IsJsValue](a1: A1): JsValue
160
- target js sync "return self_.call(void 0, a1_)"
236
+ callValue1[A1: IsJsValue](a1: A1): JsValue {
237
+ // Special cased by the compiler
238
+ self.callValue1(a1)
239
+ }
161
240
 
162
- callValue2[A1: IsJsValue, A2: IsJsValue](a1: A1, a2: A2): JsValue
163
- target js sync "return self_.call(void 0, a1_, a2_)"
241
+ callValue2[A1: IsJsValue, A2: IsJsValue](a1: A1, a2: A2): JsValue {
242
+ // Special cased by the compiler
243
+ self.callValue2(a1, a2)
244
+ }
164
245
 
165
- callValue3[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue](a1: A1, a2: A2, a3: A3): JsValue
166
- target js sync "return self_.call(void 0, a1_, a2_, a3_)"
246
+ callValue3[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue](a1: A1, a2: A2, a3: A3): JsValue {
247
+ // Special cased by the compiler
248
+ self.callValue3(a1, a2, a3)
249
+ }
167
250
 
168
- callValue4[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4): JsValue
169
- target js sync "return self_.call(void 0, a1_, a2_, a3_, a4_)"
251
+ callValue4[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4): JsValue {
252
+ // Special cased by the compiler
253
+ self.callValue4(a1, a2, a3, a4)
254
+ }
170
255
 
171
- callValue5[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): JsValue
172
- target js sync "return self_.call(void 0, a1_, a2_, a3_, a4_, a5_)"
256
+ callValue5[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): JsValue {
257
+ // Special cased by the compiler
258
+ self.callValue5(a1, a2, a3, a4, a5)
259
+ }
173
260
 
174
- callValue6[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): JsValue
175
- target js sync "return self_.call(void 0, a1_, a2_, a3_, a4_, a5_, a6_)"
261
+ callValue6[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): JsValue {
262
+ // Special cased by the compiler
263
+ self.callValue6(a1, a2, a3, a4, a5, a6)
264
+ }
176
265
 
177
- callValue7[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): JsValue
178
- target js sync "return self_.call(void 0, a1_, a2_, a3_, a4_, a5_, a6_, a7_)"
266
+ callValue7[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): JsValue {
267
+ // Special cased by the compiler
268
+ self.callValue7(a1, a2, a3, a4, a5, a6, a7)
269
+ }
179
270
 
180
- callValue8[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): JsValue
181
- target js sync "return self_.call(void 0, a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_)"
271
+ callValue8[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): JsValue {
272
+ // Special cased by the compiler
273
+ self.callValue8(a1, a2, a3, a4, a5, a6, a7, a8)
274
+ }
182
275
 
183
- callValue9[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue, A9: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9): JsValue
184
- target js sync "return self_.call(void 0, a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_)"
276
+ callValue9[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue, A9: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9): JsValue {
277
+ // Special cased by the compiler
278
+ self.callValue9(a1, a2, a3, a4, a5, a6, a7, a8, a9)
279
+ }
185
280
 
186
281
 
187
- new(this: JsValue, arguments: List[JsValue]): JsValue
188
- target js sync "return new (Function.prototype.bind.apply(self_, arguments_))"
282
+ new(arguments: List[JsValue]): JsValue {
283
+ Js->Function->prototype->bind->apply->(self, arguments)
284
+ }
189
285
 
190
- new0(): JsValue
191
- target js sync "return new self_()"
286
+ new0(): JsValue {
287
+ // Special cased by the compiler
288
+ self->()
289
+ }
192
290
 
193
- new1[A1: IsJsValue](a1: A1): JsValue
194
- target js sync "return new self_(a1_)"
291
+ new1[A1: IsJsValue](a1: A1): JsValue {
292
+ // Special cased by the compiler
293
+ self->(a1)
294
+ }
195
295
 
196
- new2[A1: IsJsValue, A2: IsJsValue](a1: A1, a2: A2): JsValue
197
- target js sync "return new self_(a1_, a2_)"
296
+ new2[A1: IsJsValue, A2: IsJsValue](a1: A1, a2: A2): JsValue {
297
+ // Special cased by the compiler
298
+ self->(a1, a2)
299
+ }
198
300
 
199
- new3[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue](a1: A1, a2: A2, a3: A3): JsValue
200
- target js sync "return new self_(a1_, a2_, a3_)"
301
+ new3[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue](a1: A1, a2: A2, a3: A3): JsValue {
302
+ // Special cased by the compiler
303
+ self->(a1, a2, a3)
304
+ }
201
305
 
202
- new4[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4): JsValue
203
- target js sync "return new self_(a1_, a2_, a3_, a4_)"
306
+ new4[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4): JsValue {
307
+ // Special cased by the compiler
308
+ self->(a1, a2, a3, a4)
309
+ }
204
310
 
205
- new5[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): JsValue
206
- target js sync "return new self_(a1_, a2_, a3_, a4_, a5_)"
311
+ new5[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): JsValue {
312
+ // Special cased by the compiler
313
+ self->(a1, a2, a3, a4, a5)
314
+ }
207
315
 
208
- new6[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): JsValue
209
- target js sync "return new self_(a1_, a2_, a3_, a4_, a5_, a6_)"
316
+ new6[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): JsValue {
317
+ // Special cased by the compiler
318
+ self->(a1, a2, a3, a4, a5, a6)
319
+ }
210
320
 
211
- new7[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): JsValue
212
- target js sync "return new self_(a1_, a2_, a3_, a4_, a5_, a6_, a7_)"
321
+ new7[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): JsValue {
322
+ // Special cased by the compiler
323
+ self->(a1, a2, a3, a4, a5, a6, a7)
324
+ }
213
325
 
214
- new8[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): JsValue
215
- target js sync "return new self_(a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_)"
326
+ new8[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): JsValue {
327
+ // Special cased by the compiler
328
+ self->(a1, a2, a3, a4, a5, a6, a7, a8)
329
+ }
216
330
 
217
- new9[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue, A9: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9): JsValue
218
- target js sync "return new self_(a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_)"
331
+ new9[A1: IsJsValue, A2: IsJsValue, A3: IsJsValue, A4: IsJsValue, A5: IsJsValue, A6: IsJsValue, A7: IsJsValue, A8: IsJsValue, A9: IsJsValue](a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8, a9: A9): JsValue {
332
+ // Special cased by the compiler
333
+ self->(a1, a2, a3, a4, a5, a6, a7, a8, a9)
334
+ }
219
335
 
220
336
 
221
- grabPairs(): List[Pair[String, JsValue]]
222
- target js sync """
223
- if(!(self_ instanceof Object)) throw new Error('Expected object, got '+ typeof self_);;
224
- return Object.getOwnPropertyNames(self_).map((name, i) => ff_core_Pair.Pair(name, self_[name]));
225
- """
337
+ grabPairs(): List[Pair[String, JsValue]] {
338
+ if(!self.isObject()) {throw(GrabException)}
339
+ Js->Object->getOwnPropertyNames(self)->map(Js->{name, i => Pair(name, self.get(name))})?
340
+ }
226
341
 
227
342
  grabMap(): Map[String, JsValue] {
228
343
  self.grabPairs().toMap()
229
344
  }
230
345
 
231
- grabIntMap(): IntMap[JsValue]
232
- target js sync """
233
- if(!(self_ instanceof Map)) throw new Error('Expected map, got '+ typeof self_);;
234
- return self_
235
- """
346
+ grabIntMap(): IntMap[JsValue] {
347
+ if(!self.instanceof(Js->Map)) {throw(GrabException)}
348
+ self?
349
+ }
236
350
 
237
- grabStringMap(): StringMap[JsValue]
238
- target js sync """
239
- if(!(self_ instanceof Map)) throw new Error('Expected map, got '+ typeof self_);;
240
- return self_
241
- """
351
+ grabStringMap(): StringMap[JsValue] {
352
+ if(!self.instanceof(Js->Map)) {throw(GrabException)}
353
+ self?
354
+ }
355
+
356
+ spreadToArray(): List[JsValue] {
357
+ // Special cased by the compiler
358
+ self.spreadToArray()
359
+ }
360
+
361
+ coalesce[T: IsJsValue](defaultValue: T): JsValue {
362
+ if(self.isNullOrUndefined()) {Js.value(defaultValue)} else {self}
363
+ }
364
+
365
+ typeof(): String {
366
+ // Special cased by the compiler
367
+ self.typeof()
368
+ }
369
+
370
+ instanceof(type: JsValue): Bool {
371
+ // Special cased by the compiler
372
+ self.instanceof(type)
373
+ }
374
+
375
+ truthy(): Bool {
376
+ Js.unaryOperator("!!", self)?
377
+ }
378
+
379
+ falsy(): Bool {
380
+ Js.unaryOperator("!", self)?
381
+ }
382
+
383
+ nullish(): Bool {
384
+ self.isNullOrUndefined() // TODO: Rename
385
+ }
242
386
 
243
387
  //toList(): List[JsValue] // TODO
244
388
  // TODO: JS operators