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
@@ -42,6 +42,8 @@ import * as ff_core_Int from "../../ff/core/Int.mjs"
42
42
 
43
43
  import * as ff_core_IntMap from "../../ff/core/IntMap.mjs"
44
44
 
45
+ import * as ff_core_Js from "../../ff/core/Js.mjs"
46
+
45
47
  import * as ff_core_JsSystem from "../../ff/core/JsSystem.mjs"
46
48
 
47
49
  import * as ff_core_JsValue from "../../ff/core/JsValue.mjs"
@@ -68,6 +70,8 @@ import * as ff_core_Pair from "../../ff/core/Pair.mjs"
68
70
 
69
71
  import * as ff_core_Path from "../../ff/core/Path.mjs"
70
72
 
73
+ import * as ff_core_Queue from "../../ff/core/Queue.mjs"
74
+
71
75
  import * as ff_core_Random from "../../ff/core/Random.mjs"
72
76
 
73
77
  import * as ff_core_Serializable from "../../ff/core/Serializable.mjs"
@@ -90,8 +94,6 @@ import * as ff_core_Try from "../../ff/core/Try.mjs"
90
94
 
91
95
  import * as ff_core_Unit from "../../ff/core/Unit.mjs"
92
96
 
93
- import * as ff_core_UnsafeJs from "../../ff/core/UnsafeJs.mjs"
94
-
95
97
  // type String
96
98
 
97
99
 
@@ -106,12 +108,10 @@ return self_.length
106
108
  }
107
109
 
108
110
  export function String_grab(self_, index_) {
109
-
110
- if(index_ < 0 || index_ >= self_.length) {
111
- ff_core_Try.internalThrowGrabException_()
112
- }
113
- return self_.charCodeAt(index_)
114
-
111
+ if(((index_ < 0) || (index_ >= self_.length))) {
112
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
113
+ };
114
+ return self_.charCodeAt(index_)
115
115
  }
116
116
 
117
117
  export function String_replace(self_, needle_, replacement_) {
@@ -123,7 +123,7 @@ return self_.replace(needle_, replacement_)
123
123
  }
124
124
 
125
125
  export function String_reverse(self_) {
126
- return [...self_].reverse().join('')
126
+ return self_.split("").reverse().join("")
127
127
  }
128
128
 
129
129
  export function String_repeat(self_, count_) {
@@ -151,19 +151,19 @@ return self_.toUpperCase()
151
151
  }
152
152
 
153
153
  export function String_dropWhile(self_, p_) {
154
-
155
- let i = 0
156
- for(; i < self_.length && p_(self_.codePointAt(i)); i++);
157
- return self_.slice(i)
158
-
154
+ let i_ = 0;
155
+ while(((i_ < self_.length) && p_(self_.charCodeAt(i_)))) {
156
+ i_ += 1
157
+ };
158
+ return self_.slice(i_)
159
159
  }
160
160
 
161
161
  export function String_takeWhile(self_, p_) {
162
-
163
- let i = 0
164
- for(; i < self_.length && p_(self_.codePointAt(i)); i++);
165
- return self_.slice(0, i)
166
-
162
+ let i_ = 0;
163
+ while(((i_ < self_.length) && p_(self_.charCodeAt(i_)))) {
164
+ i_ += 1
165
+ };
166
+ return self_.slice(0, i_)
167
167
  }
168
168
 
169
169
  export function String_slice(self_, from_, until_) {
@@ -175,20 +175,14 @@ return self_.split(String.fromCharCode(char_))
175
175
  }
176
176
 
177
177
  export function String_splitFirst(self_, char_) {
178
-
179
- const array = self_.split(String.fromCharCode(char_), 2)
180
- return array.length === 2
181
- ? ff_core_Option.Some(ff_core_Pair.Pair(array[0], array[1]))
182
- : ff_core_Option.None()
183
-
178
+ const array_ = self_.split(String.fromCharCode(char_), 2);
179
+ if((array_.length === 2)) {
180
+ return ff_core_Option.Some(ff_core_Pair.Pair(array_[0], array_[1]))
181
+ } else return ff_core_Option.None()
184
182
  }
185
183
 
186
184
  export function String_lines(self_) {
187
-
188
- return self_.split(
189
- new RegExp("[" + String.fromCharCode(13) + "]?[" + String.fromCharCode(10) + "]", "g")
190
- )
191
-
185
+ return self_.split((new RegExp((((("[" + String.fromCharCode(13)) + "]?[") + String.fromCharCode(10)) + "]"), "g")))
192
186
  }
193
187
 
194
188
  export function String_dropFirst(self_, count_ = 1) {
@@ -196,80 +190,57 @@ return self_.slice(count_)
196
190
  }
197
191
 
198
192
  export function String_dropLast(self_, count_ = 1) {
199
- return self_.slice(0, self_.length - count_)
193
+ return self_.slice(0, (self_.length - count_))
200
194
  }
201
195
 
202
196
  export function String_getInt(self_) {
203
-
204
- if(self_.length == 0) {
205
- return ff_core_Option.None()
206
- }
207
- for(let i = 0; i < self_.length; i++) {
208
- const c = self_.codePointAt(i)
209
- if(c < 48 || c > 57) return ff_core_Option.None()
210
- }
211
- return ff_core_Option.Some(parseInt(self_, 10));
212
-
197
+ if(((self_.length > 0) && ff_core_String.String_all(self_, ((c_) => {
198
+ return ((48 <= c_) && (c_ <= 57))
199
+ })))) {
200
+ return ff_core_Option.Some(parseInt(self_, 10))
201
+ } else return ff_core_Option.None()
213
202
  }
214
203
 
215
204
  export function String_getFloat(self_) {
216
-
217
- const result = parseFloat(self_, 10);
218
- if(!isFinite(result)) {
219
- return ff_core_Option.None()
220
- }
221
- return ff_core_Option.Some(result);
222
-
205
+ const result_ = parseFloat(self_, 10);
206
+ if(isFinite(result_)) {
207
+ return ff_core_Option.Some(result_)
208
+ } else return ff_core_Option.None()
223
209
  }
224
210
 
225
211
  export function String_grabInt(self_) {
226
-
227
- if(self_.length == 0) {
228
- ff_core_Try.internalThrowGrabException_()
229
- }
230
- for(let i = 0; i < self_.length; i++) {
231
- const c = self_.codePointAt(i)
232
- if(c < 48 || c > 57) ff_core_Try.internalThrowGrabException_()
233
- }
234
- return parseInt(self_, 10);
235
-
212
+ return ff_core_Option.Option_else(ff_core_String.String_getInt(self_), (() => {
213
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
214
+ }))
236
215
  }
237
216
 
238
217
  export function String_grabFloat(self_) {
239
-
240
- const result = parseFloat(self_, 10);
241
- if(!isFinite(result)) {
242
- ff_core_Try.internalThrowGrabException_()
243
- }
244
- return result;
245
-
218
+ return ff_core_Option.Option_else(ff_core_String.String_getFloat(self_), (() => {
219
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
220
+ }))
246
221
  }
247
222
 
248
223
  export function String_first(self_) {
249
-
250
- return self_.length > 0
251
- ? ff_core_Option.Some(self_.charCodeAt(0))
252
- : ff_core_Option.None()
253
-
224
+ if((self_.length > 0)) {
225
+ return ff_core_Option.Some(self_.charCodeAt(0))
226
+ } else return ff_core_Option.None()
254
227
  }
255
228
 
256
229
  export function String_last(self_) {
257
-
258
- return self_.length > 0
259
- ? ff_core_Option.Some(self_.charCodeAt(self_.length - 1))
260
- : ff_core_Option.None()
261
-
230
+ if((self_.length > 0)) {
231
+ return ff_core_Option.Some(self_.charCodeAt((self_.length - 1)))
232
+ } else return ff_core_Option.None()
262
233
  }
263
234
 
264
235
  export function String_grabFirst(self_) {
265
236
  return ff_core_Option.Option_else(ff_core_String.String_first(self_), (() => {
266
- return ff_core_Try.internalThrowGrabException_()
237
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
267
238
  }))
268
239
  }
269
240
 
270
241
  export function String_grabLast(self_) {
271
242
  return ff_core_Option.Option_else(ff_core_String.String_last(self_), (() => {
272
- return ff_core_Try.internalThrowGrabException_()
243
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
273
244
  }))
274
245
  }
275
246
 
@@ -287,7 +258,7 @@ return self_.endsWith(prefix_)
287
258
 
288
259
  export function String_removeFirst(self_, prefix_) {
289
260
  if(ff_core_String.String_startsWith(self_, prefix_, 0)) {
290
- return ff_core_Option.Some(ff_core_String.String_dropFirst(self_, ff_core_String.String_size(prefix_)))
261
+ return ff_core_Option.Some(ff_core_String.String_dropFirst(self_, prefix_.length))
291
262
  } else {
292
263
  return ff_core_Option.None()
293
264
  }
@@ -295,194 +266,261 @@ return ff_core_Option.None()
295
266
 
296
267
  export function String_removeLast(self_, suffix_) {
297
268
  if(ff_core_String.String_endsWith(self_, suffix_)) {
298
- return ff_core_Option.Some(ff_core_String.String_dropLast(self_, ff_core_String.String_size(suffix_)))
269
+ return ff_core_Option.Some(ff_core_String.String_dropLast(self_, suffix_.length))
299
270
  } else {
300
271
  return ff_core_Option.None()
301
272
  }
302
273
  }
303
274
 
304
275
  export function String_padStart(self_, length_, padding_ = " ") {
305
-
306
- return self_.padStart(length_, padding_);
307
-
276
+ return self_.padStart(length_, padding_)
308
277
  }
309
278
 
310
279
  export function String_padEnd(self_, length_, padding_ = " ") {
311
-
312
- return self_.padEnd(length_, padding_);
313
-
280
+ return self_.padEnd(length_, padding_)
314
281
  }
315
282
 
316
- export function String_any(self_, body_) {
317
-
318
- for(let i = 0; i < self_.length; i++) {
319
- if(body_(self_.charCodeAt(i))) return true;
320
- }
321
- return false;
322
-
283
+ export function String_each(self_, body_) {
284
+ let i_ = 0;
285
+ while((i_ < self_.length)) {
286
+ body_(self_.charCodeAt(i_));
287
+ i_ += 1
288
+ }
289
+ }
290
+
291
+ export function String_eachWhile(self_, body_) {
292
+ let i_ = 0;
293
+ while((i_ < self_.length)) {
294
+ if(body_(self_.charCodeAt(i_))) {
295
+ i_ += 1
296
+ } else {
297
+ i_ = self_.length
298
+ }
299
+ }
323
300
  }
324
301
 
325
302
  export function String_all(self_, body_) {
326
-
327
- for(let i = 0; i < self_.length; i++) {
328
- if(!body_(self_.charCodeAt(i))) return false;
329
- }
330
- return true;
331
-
303
+ let result_ = true;
304
+ ff_core_String.String_eachWhile(self_, ((x_) => {
305
+ result_ = body_(x_);
306
+ return result_
307
+ }));
308
+ return result_
309
+ }
310
+
311
+ export function String_any(self_, body_) {
312
+ let result_ = false;
313
+ ff_core_String.String_eachWhile(self_, ((x_) => {
314
+ result_ = body_(x_);
315
+ return (!result_)
316
+ }));
317
+ return result_
318
+ }
319
+
320
+ export function String_find(self_, body_) {
321
+ let result_ = ff_core_Option.None();
322
+ ff_core_String.String_eachWhile(self_, ((x_) => {
323
+ if(body_(x_)) {
324
+ result_ = ff_core_Option.Some(x_);
325
+ return false
326
+ } else {
327
+ return true
328
+ }
329
+ }));
330
+ return result_
331
+ }
332
+
333
+ export function String_indexOf(self_, needle_, position_ = 0) {
334
+ const index_ = self_.indexOf(needle_, position_);
335
+ if((index_ !== (-1))) {
336
+ return ff_core_Option.Some(index_)
337
+ } else return ff_core_Option.None()
338
+ }
339
+
340
+ export function String_indexWhere(self_, body_) {
341
+ let i_ = (-1);
342
+ let result_ = false;
343
+ ff_core_String.String_eachWhile(self_, ((x_) => {
344
+ i_ += 1;
345
+ result_ = body_(x_);
346
+ return (!result_)
347
+ }));
348
+ if(result_) {
349
+ return ff_core_Option.Some(i_)
350
+ } else return ff_core_Option.None()
332
351
  }
333
352
 
334
353
  export function String_filter(self_, body_) {
335
-
336
- const result = [];
337
- for(let i = 0; i < self_.length; i++) {
338
- if(body_(self_.charCodeAt(i))) result.push(self_.charAt(i));
339
- }
340
- return result.join("");
341
-
354
+ const result_ = ff_core_Array.new_();
355
+ ff_core_String.String_each(self_, ((x_) => {
356
+ if(body_(x_)) {
357
+ result_.array.push(ff_core_Char.Char_toString(x_))
358
+ }
359
+ }));
360
+ return ff_core_Array.Array_join(result_, "")
342
361
  }
343
362
 
344
363
  export function String_toBuffer(self_) {
345
-
346
- const encoded = new TextEncoder().encode(self_)
347
- return new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength)
348
-
364
+ const encoded_ = (new TextEncoder()).encode(self_);
365
+ return (new DataView(encoded_.buffer, encoded_.byteOffset, encoded_.byteLength))
349
366
  }
350
367
 
351
368
  export async function String_size$(self_, $task) {
352
- throw new Error('Function String_size is missing on this target in async context.');
369
+ return self_.length
353
370
  }
354
371
 
355
372
  export async function String_grab$(self_, index_, $task) {
356
- throw new Error('Function String_grab is missing on this target in async context.');
373
+ if(((index_ < 0) || (index_ >= self_.length))) {
374
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
375
+ };
376
+ return self_.charCodeAt(index_)
357
377
  }
358
378
 
359
379
  export async function String_replace$(self_, needle_, replacement_, $task) {
360
- throw new Error('Function String_replace is missing on this target in async context.');
380
+ return self_.replaceAll(needle_, replacement_)
361
381
  }
362
382
 
363
383
  export async function String_replaceFirst$(self_, needle_, replacement_, $task) {
364
- throw new Error('Function String_replaceFirst is missing on this target in async context.');
384
+ return self_.replace(needle_, replacement_)
365
385
  }
366
386
 
367
387
  export async function String_reverse$(self_, $task) {
368
- throw new Error('Function String_reverse is missing on this target in async context.');
388
+ return self_.split("").reverse().join("")
369
389
  }
370
390
 
371
391
  export async function String_repeat$(self_, count_, $task) {
372
- throw new Error('Function String_repeat is missing on this target in async context.');
392
+ return self_.repeat(count_)
373
393
  }
374
394
 
375
395
  export async function String_trim$(self_, $task) {
376
- throw new Error('Function String_trim is missing on this target in async context.');
396
+ return self_.trim()
377
397
  }
378
398
 
379
399
  export async function String_trimStart$(self_, $task) {
380
- throw new Error('Function String_trimStart is missing on this target in async context.');
400
+ return self_.trimStart()
381
401
  }
382
402
 
383
403
  export async function String_trimEnd$(self_, $task) {
384
- throw new Error('Function String_trimEnd is missing on this target in async context.');
404
+ return self_.trimEnd()
385
405
  }
386
406
 
387
407
  export async function String_lower$(self_, $task) {
388
- throw new Error('Function String_lower is missing on this target in async context.');
408
+ return self_.toLowerCase()
389
409
  }
390
410
 
391
411
  export async function String_upper$(self_, $task) {
392
- throw new Error('Function String_upper is missing on this target in async context.');
412
+ return self_.toUpperCase()
393
413
  }
394
414
 
395
415
  export async function String_dropWhile$(self_, p_, $task) {
396
-
397
- let i = 0
398
- for(; i < self_.length && await p_(self_.codePointAt(i), $task); i++);
399
- return self_.slice(i)
400
-
416
+ let i_ = 0;
417
+ while(((i_ < self_.length) && (await p_(self_.charCodeAt(i_), $task)))) {
418
+ i_ += 1
419
+ };
420
+ return self_.slice(i_)
401
421
  }
402
422
 
403
423
  export async function String_takeWhile$(self_, p_, $task) {
404
-
405
- let i = 0
406
- for(; i < self_.length && await p_(self_.codePointAt(i), $task); i++);
407
- return self_.slice(0, i)
408
-
424
+ let i_ = 0;
425
+ while(((i_ < self_.length) && (await p_(self_.charCodeAt(i_), $task)))) {
426
+ i_ += 1
427
+ };
428
+ return self_.slice(0, i_)
409
429
  }
410
430
 
411
431
  export async function String_slice$(self_, from_, until_, $task) {
412
- throw new Error('Function String_slice is missing on this target in async context.');
432
+ return self_.slice(from_, until_)
413
433
  }
414
434
 
415
435
  export async function String_split$(self_, char_, $task) {
416
- throw new Error('Function String_split is missing on this target in async context.');
436
+ return self_.split(String.fromCharCode(char_))
417
437
  }
418
438
 
419
439
  export async function String_splitFirst$(self_, char_, $task) {
420
- throw new Error('Function String_splitFirst is missing on this target in async context.');
440
+ const array_ = self_.split(String.fromCharCode(char_), 2);
441
+ if((array_.length === 2)) {
442
+ return ff_core_Option.Some(ff_core_Pair.Pair(array_[0], array_[1]))
443
+ } else return ff_core_Option.None()
421
444
  }
422
445
 
423
446
  export async function String_lines$(self_, $task) {
424
- throw new Error('Function String_lines is missing on this target in async context.');
447
+ return self_.split((new RegExp((((("[" + String.fromCharCode(13)) + "]?[") + String.fromCharCode(10)) + "]"), "g")))
425
448
  }
426
449
 
427
450
  export async function String_dropFirst$(self_, count_ = 1, $task) {
428
- throw new Error('Function String_dropFirst is missing on this target in async context.');
451
+ return self_.slice(count_)
429
452
  }
430
453
 
431
454
  export async function String_dropLast$(self_, count_ = 1, $task) {
432
- throw new Error('Function String_dropLast is missing on this target in async context.');
455
+ return self_.slice(0, (self_.length - count_))
433
456
  }
434
457
 
435
458
  export async function String_getInt$(self_, $task) {
436
- throw new Error('Function String_getInt is missing on this target in async context.');
459
+ if(((self_.length > 0) && ff_core_String.String_all(self_, ((c_) => {
460
+ return ((48 <= c_) && (c_ <= 57))
461
+ })))) {
462
+ return ff_core_Option.Some(parseInt(self_, 10))
463
+ } else return ff_core_Option.None()
437
464
  }
438
465
 
439
466
  export async function String_getFloat$(self_, $task) {
440
- throw new Error('Function String_getFloat is missing on this target in async context.');
467
+ const result_ = parseFloat(self_, 10);
468
+ if(isFinite(result_)) {
469
+ return ff_core_Option.Some(result_)
470
+ } else return ff_core_Option.None()
441
471
  }
442
472
 
443
473
  export async function String_grabInt$(self_, $task) {
444
- throw new Error('Function String_grabInt is missing on this target in async context.');
474
+ return ff_core_Option.Option_else(ff_core_String.String_getInt(self_), (() => {
475
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
476
+ }))
445
477
  }
446
478
 
447
479
  export async function String_grabFloat$(self_, $task) {
448
- throw new Error('Function String_grabFloat is missing on this target in async context.');
480
+ return ff_core_Option.Option_else(ff_core_String.String_getFloat(self_), (() => {
481
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
482
+ }))
449
483
  }
450
484
 
451
485
  export async function String_first$(self_, $task) {
452
- throw new Error('Function String_first is missing on this target in async context.');
486
+ if((self_.length > 0)) {
487
+ return ff_core_Option.Some(self_.charCodeAt(0))
488
+ } else return ff_core_Option.None()
453
489
  }
454
490
 
455
491
  export async function String_last$(self_, $task) {
456
- throw new Error('Function String_last is missing on this target in async context.');
492
+ if((self_.length > 0)) {
493
+ return ff_core_Option.Some(self_.charCodeAt((self_.length - 1)))
494
+ } else return ff_core_Option.None()
457
495
  }
458
496
 
459
497
  export async function String_grabFirst$(self_, $task) {
460
498
  return ff_core_Option.Option_else(ff_core_String.String_first(self_), (() => {
461
- return ff_core_Try.internalThrowGrabException_()
499
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
462
500
  }))
463
501
  }
464
502
 
465
503
  export async function String_grabLast$(self_, $task) {
466
504
  return ff_core_Option.Option_else(ff_core_String.String_last(self_), (() => {
467
- return ff_core_Try.internalThrowGrabException_()
505
+ throw Object.assign(new Error(), {ffException: ff_core_Any.toAny_(ff_core_Core.GrabException(), ff_core_Core.ff_core_Any_HasAnyTag$ff_core_Core_GrabException)})
468
506
  }))
469
507
  }
470
508
 
471
509
  export async function String_contains$(self_, substring_, $task) {
472
- throw new Error('Function String_contains is missing on this target in async context.');
510
+ return self_.includes(substring_)
473
511
  }
474
512
 
475
513
  export async function String_startsWith$(self_, prefix_, offset_ = 0, $task) {
476
- throw new Error('Function String_startsWith is missing on this target in async context.');
514
+ return self_.startsWith(prefix_, offset_)
477
515
  }
478
516
 
479
517
  export async function String_endsWith$(self_, prefix_, $task) {
480
- throw new Error('Function String_endsWith is missing on this target in async context.');
518
+ return self_.endsWith(prefix_)
481
519
  }
482
520
 
483
521
  export async function String_removeFirst$(self_, prefix_, $task) {
484
522
  if(ff_core_String.String_startsWith(self_, prefix_, 0)) {
485
- return ff_core_Option.Some(ff_core_String.String_dropFirst(self_, ff_core_String.String_size(prefix_)))
523
+ return ff_core_Option.Some(ff_core_String.String_dropFirst(self_, prefix_.length))
486
524
  } else {
487
525
  return ff_core_Option.None()
488
526
  }
@@ -490,50 +528,103 @@ return ff_core_Option.None()
490
528
 
491
529
  export async function String_removeLast$(self_, suffix_, $task) {
492
530
  if(ff_core_String.String_endsWith(self_, suffix_)) {
493
- return ff_core_Option.Some(ff_core_String.String_dropLast(self_, ff_core_String.String_size(suffix_)))
531
+ return ff_core_Option.Some(ff_core_String.String_dropLast(self_, suffix_.length))
494
532
  } else {
495
533
  return ff_core_Option.None()
496
534
  }
497
535
  }
498
536
 
499
537
  export async function String_padStart$(self_, length_, padding_ = " ", $task) {
500
- throw new Error('Function String_padStart is missing on this target in async context.');
538
+ return self_.padStart(length_, padding_)
501
539
  }
502
540
 
503
541
  export async function String_padEnd$(self_, length_, padding_ = " ", $task) {
504
- throw new Error('Function String_padEnd is missing on this target in async context.');
542
+ return self_.padEnd(length_, padding_)
505
543
  }
506
544
 
507
- export async function String_any$(self_, body_, $task) {
508
-
509
- for(let i = 0; i < self_.length; i++) {
510
- if(await body_(self_.charCodeAt(i), $task)) return true;
511
- }
512
- return false;
513
-
545
+ export async function String_each$(self_, body_, $task) {
546
+ let i_ = 0;
547
+ while((i_ < self_.length)) {
548
+ (await body_(self_.charCodeAt(i_), $task));
549
+ i_ += 1
550
+ }
551
+ }
552
+
553
+ export async function String_eachWhile$(self_, body_, $task) {
554
+ let i_ = 0;
555
+ while((i_ < self_.length)) {
556
+ if((await body_(self_.charCodeAt(i_), $task))) {
557
+ i_ += 1
558
+ } else {
559
+ i_ = self_.length
560
+ }
561
+ }
514
562
  }
515
563
 
516
564
  export async function String_all$(self_, body_, $task) {
517
-
518
- for(let i = 0; i < self_.length; i++) {
519
- if(!await body_(self_.charCodeAt(i), $task)) return false;
520
- }
521
- return true;
522
-
565
+ let result_ = true;
566
+ (await ff_core_String.String_eachWhile$(self_, (async (x_, $task) => {
567
+ result_ = (await body_(x_, $task));
568
+ return result_
569
+ }), $task));
570
+ return result_
571
+ }
572
+
573
+ export async function String_any$(self_, body_, $task) {
574
+ let result_ = false;
575
+ (await ff_core_String.String_eachWhile$(self_, (async (x_, $task) => {
576
+ result_ = (await body_(x_, $task));
577
+ return (!result_)
578
+ }), $task));
579
+ return result_
580
+ }
581
+
582
+ export async function String_find$(self_, body_, $task) {
583
+ let result_ = ff_core_Option.None();
584
+ (await ff_core_String.String_eachWhile$(self_, (async (x_, $task) => {
585
+ if((await body_(x_, $task))) {
586
+ result_ = ff_core_Option.Some(x_);
587
+ return false
588
+ } else {
589
+ return true
590
+ }
591
+ }), $task));
592
+ return result_
593
+ }
594
+
595
+ export async function String_indexOf$(self_, needle_, position_ = 0, $task) {
596
+ const index_ = self_.indexOf(needle_, position_);
597
+ if((index_ !== (-1))) {
598
+ return ff_core_Option.Some(index_)
599
+ } else return ff_core_Option.None()
600
+ }
601
+
602
+ export async function String_indexWhere$(self_, body_, $task) {
603
+ let i_ = (-1);
604
+ let result_ = false;
605
+ (await ff_core_String.String_eachWhile$(self_, (async (x_, $task) => {
606
+ i_ += 1;
607
+ result_ = (await body_(x_, $task));
608
+ return (!result_)
609
+ }), $task));
610
+ if(result_) {
611
+ return ff_core_Option.Some(i_)
612
+ } else return ff_core_Option.None()
523
613
  }
524
614
 
525
615
  export async function String_filter$(self_, body_, $task) {
526
-
527
- const result = [];
528
- for(let i = 0; i < self_.length; i++) {
529
- if(await body_(self_.charCodeAt(i))) result.push(self_.charAt(i));
530
- }
531
- return result.join("");
532
-
616
+ const result_ = ff_core_Array.new_();
617
+ (await ff_core_String.String_each$(self_, (async (x_, $task) => {
618
+ if((await body_(x_, $task))) {
619
+ result_.array.push(ff_core_Char.Char_toString(x_))
620
+ }
621
+ }), $task));
622
+ return ff_core_Array.Array_join(result_, "")
533
623
  }
534
624
 
535
625
  export async function String_toBuffer$(self_, $task) {
536
- throw new Error('Function String_toBuffer is missing on this target in async context.');
626
+ const encoded_ = (new TextEncoder()).encode(self_);
627
+ return (new DataView(encoded_.buffer, encoded_.byteOffset, encoded_.byteLength))
537
628
  }
538
629
 
539
630
  export const ff_core_Any_HasAnyTag$ff_core_String_String = {