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/RbMap.ff CHANGED
@@ -1,216 +1,216 @@
1
- // Based on https://www.cs.kent.ac.uk/people/staff/smk/redblack/Untyped.hs
2
-
3
- data Color {
4
- R
5
- B
6
- }
7
-
8
- data RB[K, V] {
9
- E
10
- T(color: Color, left: RB[K, V], key: K, value: V, right: RB[K, V])
11
- }
12
-
13
- insert[K: Order, V](x: K, xv: V, s: RB[K, V]): RB[K, V] {
14
- function ins(s: RB[K, V]): RB[K, V] {
15
- | E => T(R, E, x, xv, E)
16
- | T(B, a, y, yv, b) => Ordering.compare(x, y).{
17
- | OrderingBefore => balance(ins(a), y, yv, b)
18
- | OrderingAfter => balance(a, y, yv, ins(b))
19
- | OrderingSame => T(B, a, x, xv, b)
20
- }
21
- | T(R, a, y, yv, b) => Ordering.compare(x, y).{
22
- | OrderingBefore => T(R, ins(a), y, yv, b)
23
- | OrderingAfter => T(R, a, y, yv, ins(b))
24
- | OrderingSame => T(R, a, x, xv, b)
25
- }
26
- }
27
-
28
- ins(s).{
29
- | E => panic("Unexpected empty tree")
30
- | T(_, a, z, zv, b) => T(B, a, z, zv, b)
31
- }
32
- }
33
-
34
- member[K: Order, V](key: K, tree: RB[K, V]): Bool {
35
- | x, E => False
36
- | x, T(_, a, y, _, b,) => Ordering.compare(x, y).{
37
- | OrderingBefore => member(x, a)
38
- | OrderingAfter => member(x, b)
39
- | OrderingSame => True
40
- }
41
- }
42
-
43
- balance[K: Order, V](tree1: RB[K, V], key: K, value: V, tree2: RB[K, V]): RB[K, V] {
44
- | T(R, a, x, xv, b), y, yv, T(R, c, z, zv, d) => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
45
- | T(R, T(R, a, x, xv, b), y, yv, c), z, zv, d => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
46
- | T(R, a, x, xv, T(R, b, y, yv, c)), z, zv, d => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
47
- | a, x, xv, T(R, b, y, yv, T(R, c, z, zv, d)) => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
48
- | a, x, xv, T(R, T(R, b, y, yv, c), z, zv, d) => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
49
- | a, x, xv, b => T(B, a, x, xv, b)
50
- }
51
-
52
- delete[K: Order, V](x: K, t: RB[K, V]): RB[K, V] {
53
- function del(ss: RB[K, V]): RB[K, V] {
54
- | E => E
55
- | T(_, a, y, yv, b) => Ordering.compare(x, y).{
56
- | OrderingBefore => delformLeft(a, y, yv, b)
57
- | OrderingAfter => delformRight(a, y, yv, b)
58
- | OrderingSame => app(a, b)
59
- }
60
- }
61
-
62
- function delformLeft(left: RB[K, V], key: K, value: V, right: RB[K, V]): RB[K, V] {
63
- | T(B, _, _, _, _), y, yv, b => balleft(del(left), y, yv, b)
64
- | a, y, yv, b => T(R, del(a), y, yv, b)
65
- }
66
-
67
- function delformRight(left: RB[K, V], key: K, value: V, right: RB[K, V]): RB[K, V] {
68
- | a, y, yv, T(B, _, _, _, _) => balright(a, y, yv, del(right))
69
- | a, y, yv, b => T(R, a, y, yv, del(b))
70
- }
71
-
72
- del(t).{
73
- | T(_, a, y, yv, b) => T(B, a, y, yv, b)
74
- | _ => E
75
- }
76
- }
77
-
78
- balleft[K: Order, V](tree1: RB[K, V], key: K, value: V, tree2: RB[K, V]): RB[K, V] {
79
- | T(R, a, x, xv, b), y, yv, c => T(R, T(B, a, x, xv, b), y, yv, c)
80
- | bl, x, xv, T(B, a, y, yv, b) => balance(bl, x, xv, T(R, a, y, yv, b))
81
- | bl, x, xv, T(R, T(B, a, y, yv, b), z, zv, c) => T(R, T(B, bl, x, xv, a), y, yv, (balance(b, z, zv, sub1(c))))
82
- | _, _, _, _ => panic("Unexhaustive match in balleft")
83
- }
84
-
85
- balright[K: Order, V](tree1: RB[K, V], key: K, value: V, tree2: RB[K, V]): RB[K, V] {
86
- | a, x, xv, T(R, b, y, yv, c) => T(R, a, x, xv, T(B, b, y, yv, c))
87
- | T(B, a, x, xv, b), y, yv, bl => balance(T(R, a, x, xv, b), y, yv, bl)
88
- | T(R, a, x, xv, T(B, b, y, yv, c)), z, zv, bl => T(R, balance(sub1(a), x, xv, b), y, yv, T(B, c, z, zv, bl))
89
- | _, _, _, _ => panic("Unexhaustive match in balright")
90
- }
91
-
92
- sub1[K: Order, V](tree: RB[K, V]): RB[K, V] {
93
- | T(B, a, x, xv, b) => T(R, a, x, xv, b)
94
- | _ => panic("invariance violation")
95
- }
96
-
97
- app[K: Order, V](tree1: RB[K, V], tree2: RB[K, V]): RB[K, V] {
98
- | E, b => b
99
- | a, E => a
100
- | T(R, a, x, xv, b), T(R, c, y, yv, d) =>
101
- app(b, c).{
102
- | T(R, b2, z, zv, c2) => T(R, T(R, a, x, xv, b2), z, zv, T(R, c2, y, yv, d))
103
- | bc => T(R, a, x, xv, T(R, bc, y, yv, d))
104
- }
105
- | T(B, a, x, xv, b), T(B, c, y, yv, d) =>
106
- app(b, c).{
107
- | T(R, b2, z, zv, c2) => T(R, T(B, a, x, xv, b2), z, zv, T(B, c2, y, yv, d))
108
- | bc => balleft(a, x, xv, T(B, bc, y, yv, d))
109
- }
110
- | a, T(R, b, x, xv, c) => T(R, app(a, b), x, xv, c)
111
- | T(R, a, x, xv, b), c => T(R, a, x, xv, app(b, c))
112
- }
113
-
114
- extend self[K: Order, V]: RB[K, V] {
115
-
116
- get(key: K): Option[V] {
117
- self.{
118
- | E_ => None
119
- | T(_, a, y, yv, b) => Ordering.compare(key, y).{
120
- | OrderingBefore => a.get(key)
121
- | OrderingAfter => b.get(key)
122
- | OrderingSame => Some(yv)
123
- }
124
- }
125
- }
126
-
127
- size(): Int {
128
- self.{
129
- | E => 0
130
- | T(_, l, _, _, r) => l.size() + 1 + r.size()
131
- }
132
- }
133
-
134
- pairs(): List[Pair[K, V]] {
135
- let result = [].toArray()
136
- self.each {k, v =>
137
- result.push(Pair(k, v))
138
- }
139
- result.drain()
140
- }
141
-
142
- toStream(cycle: Bool): Stream[Pair[K, V]] {
143
- mutable array = [self]
144
- function next(): Option[Pair[K, V]] {
145
- array.{
146
- | [] =>
147
- if(cycle && self.{| E => False | _ => True}) {
148
- array = [self]
149
- tailcall next()
150
- } else {
151
- None
152
- }
153
- | [E, ...tail] =>
154
- array = tail
155
- tailcall next()
156
- | [T(_, E, k, v, E), ...tail] =>
157
- array = tail
158
- Some(Pair(k, v))
159
- | [T(_, l, k, v, r), ...tail] =>
160
- array = [l, T(B, E, k, v, E), r, ...tail]
161
- tailcall next()
162
- }
163
- }
164
- Stream.new(next)
165
- }
166
-
167
- each(body: (K, V) => Unit): Unit {
168
- self.{
169
- | E =>
170
- | T(_, l, k, v, r) =>
171
- l.each(body)
172
- body(k, v)
173
- r.each(body)
174
- }
175
- }
176
-
177
- eachWhile(body: (K, V) => Bool): Bool {
178
- self.{
179
- | E =>
180
- True
181
- | T(_, l, k, v, r) =>
182
- l.eachWhile(body) &&
183
- body(k, v) &&
184
- r.eachWhile(body)
185
- }
186
- }
187
-
188
- map[K2: Order, V2](body: (K, V) => Pair[K2, V2]): RB[K2, V2] {
189
- mutable result = E
190
- self.each {k, v =>
191
- let pair = body(k, v)
192
- result = insert(pair.first, pair.second, result)
193
- }
194
- result
195
- }
196
-
197
- mapValues[V2](body: (K, V) => V2): RB[K, V2] {
198
- self.{
199
- | E => E
200
- | T(c, l, k, v, r) =>
201
- T(c, l.mapValues(body), k, body(k, v), r.mapValues(body))
202
- }
203
- }
204
-
205
- find(body: (K, V) => Bool): Option[Pair[K, V]] {
206
- mutable result = None
207
- self.eachWhile {k, v =>
208
- if(body(k, v)) {
209
- result = Some(Pair(k, v))
210
- False
211
- } else {True}
212
- }
213
- result
214
- }
215
-
216
- }
1
+ // Based on https://www.cs.kent.ac.uk/people/staff/smk/redblack/Untyped.hs
2
+
3
+ data Color {
4
+ R
5
+ B
6
+ }
7
+
8
+ data RB[K, V] {
9
+ E
10
+ T(color: Color, left: RB[K, V], key: K, value: V, right: RB[K, V])
11
+ }
12
+
13
+ insert[K: Order, V](x: K, xv: V, s: RB[K, V]): RB[K, V] {
14
+ function ins(s: RB[K, V]): RB[K, V] {
15
+ | E => T(R, E, x, xv, E)
16
+ | T(B, a, y, yv, b) => Ordering.compare(x, y).{
17
+ | OrderingBefore => balance(ins(a), y, yv, b)
18
+ | OrderingAfter => balance(a, y, yv, ins(b))
19
+ | OrderingSame => T(B, a, x, xv, b)
20
+ }
21
+ | T(R, a, y, yv, b) => Ordering.compare(x, y).{
22
+ | OrderingBefore => T(R, ins(a), y, yv, b)
23
+ | OrderingAfter => T(R, a, y, yv, ins(b))
24
+ | OrderingSame => T(R, a, x, xv, b)
25
+ }
26
+ }
27
+
28
+ ins(s).{
29
+ | E => panic("Unexpected empty tree")
30
+ | T(_, a, z, zv, b) => T(B, a, z, zv, b)
31
+ }
32
+ }
33
+
34
+ member[K: Order, V](key: K, tree: RB[K, V]): Bool {
35
+ | x, E => False
36
+ | x, T(_, a, y, _, b,) => Ordering.compare(x, y).{
37
+ | OrderingBefore => member(x, a)
38
+ | OrderingAfter => member(x, b)
39
+ | OrderingSame => True
40
+ }
41
+ }
42
+
43
+ balance[K: Order, V](tree1: RB[K, V], key: K, value: V, tree2: RB[K, V]): RB[K, V] {
44
+ | T(R, a, x, xv, b), y, yv, T(R, c, z, zv, d) => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
45
+ | T(R, T(R, a, x, xv, b), y, yv, c), z, zv, d => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
46
+ | T(R, a, x, xv, T(R, b, y, yv, c)), z, zv, d => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
47
+ | a, x, xv, T(R, b, y, yv, T(R, c, z, zv, d)) => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
48
+ | a, x, xv, T(R, T(R, b, y, yv, c), z, zv, d) => T(R, T(B, a, x, xv, b), y, yv, T(B, c, z, zv, d))
49
+ | a, x, xv, b => T(B, a, x, xv, b)
50
+ }
51
+
52
+ delete[K: Order, V](x: K, t: RB[K, V]): RB[K, V] {
53
+ function del(ss: RB[K, V]): RB[K, V] {
54
+ | E => E
55
+ | T(_, a, y, yv, b) => Ordering.compare(x, y).{
56
+ | OrderingBefore => delformLeft(a, y, yv, b)
57
+ | OrderingAfter => delformRight(a, y, yv, b)
58
+ | OrderingSame => app(a, b)
59
+ }
60
+ }
61
+
62
+ function delformLeft(left: RB[K, V], key: K, value: V, right: RB[K, V]): RB[K, V] {
63
+ | T(B, _, _, _, _), y, yv, b => balleft(del(left), y, yv, b)
64
+ | a, y, yv, b => T(R, del(a), y, yv, b)
65
+ }
66
+
67
+ function delformRight(left: RB[K, V], key: K, value: V, right: RB[K, V]): RB[K, V] {
68
+ | a, y, yv, T(B, _, _, _, _) => balright(a, y, yv, del(right))
69
+ | a, y, yv, b => T(R, a, y, yv, del(b))
70
+ }
71
+
72
+ del(t).{
73
+ | T(_, a, y, yv, b) => T(B, a, y, yv, b)
74
+ | _ => E
75
+ }
76
+ }
77
+
78
+ balleft[K: Order, V](tree1: RB[K, V], key: K, value: V, tree2: RB[K, V]): RB[K, V] {
79
+ | T(R, a, x, xv, b), y, yv, c => T(R, T(B, a, x, xv, b), y, yv, c)
80
+ | bl, x, xv, T(B, a, y, yv, b) => balance(bl, x, xv, T(R, a, y, yv, b))
81
+ | bl, x, xv, T(R, T(B, a, y, yv, b), z, zv, c) => T(R, T(B, bl, x, xv, a), y, yv, (balance(b, z, zv, sub1(c))))
82
+ | _, _, _, _ => panic("Unexhaustive match in balleft")
83
+ }
84
+
85
+ balright[K: Order, V](tree1: RB[K, V], key: K, value: V, tree2: RB[K, V]): RB[K, V] {
86
+ | a, x, xv, T(R, b, y, yv, c) => T(R, a, x, xv, T(B, b, y, yv, c))
87
+ | T(B, a, x, xv, b), y, yv, bl => balance(T(R, a, x, xv, b), y, yv, bl)
88
+ | T(R, a, x, xv, T(B, b, y, yv, c)), z, zv, bl => T(R, balance(sub1(a), x, xv, b), y, yv, T(B, c, z, zv, bl))
89
+ | _, _, _, _ => panic("Unexhaustive match in balright")
90
+ }
91
+
92
+ sub1[K: Order, V](tree: RB[K, V]): RB[K, V] {
93
+ | T(B, a, x, xv, b) => T(R, a, x, xv, b)
94
+ | _ => panic("invariance violation")
95
+ }
96
+
97
+ app[K: Order, V](tree1: RB[K, V], tree2: RB[K, V]): RB[K, V] {
98
+ | E, b => b
99
+ | a, E => a
100
+ | T(R, a, x, xv, b), T(R, c, y, yv, d) =>
101
+ app(b, c).{
102
+ | T(R, b2, z, zv, c2) => T(R, T(R, a, x, xv, b2), z, zv, T(R, c2, y, yv, d))
103
+ | bc => T(R, a, x, xv, T(R, bc, y, yv, d))
104
+ }
105
+ | T(B, a, x, xv, b), T(B, c, y, yv, d) =>
106
+ app(b, c).{
107
+ | T(R, b2, z, zv, c2) => T(R, T(B, a, x, xv, b2), z, zv, T(B, c2, y, yv, d))
108
+ | bc => balleft(a, x, xv, T(B, bc, y, yv, d))
109
+ }
110
+ | a, T(R, b, x, xv, c) => T(R, app(a, b), x, xv, c)
111
+ | T(R, a, x, xv, b), c => T(R, a, x, xv, app(b, c))
112
+ }
113
+
114
+ extend self[K: Order, V]: RB[K, V] {
115
+
116
+ get(key: K): Option[V] {
117
+ self.{
118
+ | E_ => None
119
+ | T(_, a, y, yv, b) => Ordering.compare(key, y).{
120
+ | OrderingBefore => a.get(key)
121
+ | OrderingAfter => b.get(key)
122
+ | OrderingSame => Some(yv)
123
+ }
124
+ }
125
+ }
126
+
127
+ size(): Int {
128
+ self.{
129
+ | E => 0
130
+ | T(_, l, _, _, r) => l.size() + 1 + r.size()
131
+ }
132
+ }
133
+
134
+ pairs(): List[Pair[K, V]] {
135
+ let result = [].toArray()
136
+ self.each {k, v =>
137
+ result.push(Pair(k, v))
138
+ }
139
+ result.drain()
140
+ }
141
+
142
+ toStream(cycle: Bool): Stream[Pair[K, V]] {
143
+ mutable array = [self]
144
+ function next(): Option[Pair[K, V]] {
145
+ array.{
146
+ | [] =>
147
+ if(cycle && self.{| E => False | _ => True}) {
148
+ array = [self]
149
+ tailcall next()
150
+ } else {
151
+ None
152
+ }
153
+ | [E, ...tail] =>
154
+ array = tail
155
+ tailcall next()
156
+ | [T(_, E, k, v, E), ...tail] =>
157
+ array = tail
158
+ Some(Pair(k, v))
159
+ | [T(_, l, k, v, r), ...tail] =>
160
+ array = [l, T(B, E, k, v, E), r, ...tail]
161
+ tailcall next()
162
+ }
163
+ }
164
+ Stream.new(next)
165
+ }
166
+
167
+ each(body: (K, V) => Unit): Unit {
168
+ self.{
169
+ | E =>
170
+ | T(_, l, k, v, r) =>
171
+ l.each(body)
172
+ body(k, v)
173
+ r.each(body)
174
+ }
175
+ }
176
+
177
+ eachWhile(body: (K, V) => Bool): Bool {
178
+ self.{
179
+ | E =>
180
+ True
181
+ | T(_, l, k, v, r) =>
182
+ l.eachWhile(body) &&
183
+ body(k, v) &&
184
+ r.eachWhile(body)
185
+ }
186
+ }
187
+
188
+ map[K2: Order, V2](body: (K, V) => Pair[K2, V2]): RB[K2, V2] {
189
+ mutable result = E
190
+ self.each {k, v =>
191
+ let pair = body(k, v)
192
+ result = insert(pair.first, pair.second, result)
193
+ }
194
+ result
195
+ }
196
+
197
+ mapValues[V2](body: (K, V) => V2): RB[K, V2] {
198
+ self.{
199
+ | E => E
200
+ | T(c, l, k, v, r) =>
201
+ T(c, l.mapValues(body), k, body(k, v), r.mapValues(body))
202
+ }
203
+ }
204
+
205
+ find(body: (K, V) => Bool): Option[Pair[K, V]] {
206
+ mutable result = None
207
+ self.eachWhile {k, v =>
208
+ if(body(k, v)) {
209
+ result = Some(Pair(k, v))
210
+ False
211
+ } else {True}
212
+ }
213
+ result
214
+ }
215
+
216
+ }
@@ -147,18 +147,21 @@ instance String: Serializable {
147
147
  }
148
148
 
149
149
 
150
- internalSetLatin1(self: Buffer, byteOffset: Int, value: String): Bool
151
- target js sync """
152
- for(let i = 0; i < value_.length; i++) {
153
- let charCode = value_.charCodeAt(i)
154
- if(charCode >= 256) return false
155
- self_.setUint8(byteOffset_ + i, charCode)
150
+ internalSetLatin1(self: Buffer, byteOffset: Int, value: String): Bool {
151
+ mutable result = True
152
+ 0.until(value.size()).eachWhile {i =>
153
+ let charCode: Int = value!->charCodeAt(i)?
154
+ if(charCode >= 256) {
155
+ result = False
156
+ } else {
157
+ self!->setUint8(byteOffset + i, charCode)
156
158
  }
157
- return true
158
- """
159
+ result
160
+ }
161
+ result
162
+ }
159
163
 
160
- internalGrabLatin1(self: Buffer, byteOffset: Int, size: Int): String
161
- target js sync """
162
- const codeUnits = new Uint8Array(self_.buffer, self_.byteOffset + byteOffset_, size_)
163
- return String.fromCharCode.apply(null, codeUnits)
164
- """
164
+ internalGrabLatin1(self: Buffer, byteOffset: Int, size: Int): String {
165
+ let codeUnits = Js->Uint8Array->(self!->buffer, self!->byteOffset + byteOffset!, size)
166
+ Js->String->fromCharCode->apply(Js.null(), codeUnits)?
167
+ }
package/core/Show.ff CHANGED
@@ -1,43 +1,44 @@
1
- trait T: Show {
2
- show(value: T): String
3
- }
4
-
5
- instance Bool: Show {
6
- show(value: Bool): String {
7
- | False => "False"
8
- | True => "True"
9
- }
10
- }
11
-
12
- instance Nothing: Show {
13
- show(value: Nothing): String {""}
14
- }
15
-
16
- instance Char: Show {
17
- show(value: Char): String {value.toString()}
18
- }
19
-
20
- instance Int: Show {
21
- show(value: Int): String {"" + value}
22
- }
23
-
24
- instance Float: Show {
25
- show(value: Float): String {"" + value}
26
- }
27
-
28
- instance String: Show {
29
- show(value: String): String
30
- target js sync "return JSON.stringify(value_);"
31
- }
32
-
33
- instance List[T: Show]: Show {
34
- show(value: List[T]): String {
35
- "[" + value.map(show).join(", ") + "]"
36
- }
37
- }
38
-
39
- instance Pair[A: Show, B: Show]: Show {
40
- show(value: Pair[A, B]): String {
41
- "Pair(" + show(value.first) + ", " + show(value.second) + ")"
42
- }
43
- }
1
+ trait T: Show {
2
+ show(value: T): String
3
+ }
4
+
5
+ instance Bool: Show {
6
+ show(value: Bool): String {
7
+ | False => "False"
8
+ | True => "True"
9
+ }
10
+ }
11
+
12
+ instance Nothing: Show {
13
+ show(value: Nothing): String {""}
14
+ }
15
+
16
+ instance Char: Show {
17
+ show(value: Char): String {value.toString()}
18
+ }
19
+
20
+ instance Int: Show {
21
+ show(value: Int): String {"" + value}
22
+ }
23
+
24
+ instance Float: Show {
25
+ show(value: Float): String {"" + value}
26
+ }
27
+
28
+ instance String: Show {
29
+ show(value: String): String {
30
+ Js->JSON->stringify(value)?
31
+ }
32
+ }
33
+
34
+ instance List[T: Show]: Show {
35
+ show(value: List[T]): String {
36
+ "[" + value.map(show).join(", ") + "]"
37
+ }
38
+ }
39
+
40
+ instance Pair[A: Show, B: Show]: Show {
41
+ show(value: Pair[A, B]): String {
42
+ "Pair(" + show(value.first) + ", " + show(value.second) + ")"
43
+ }
44
+ }