firefly-compiler 0.4.31 → 0.4.32

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 (91) hide show
  1. package/bin/Release.ff +6 -0
  2. package/compiler/Builder.ff +15 -7
  3. package/compiler/Compiler.ff +13 -8
  4. package/compiler/Dependencies.ff +24 -17
  5. package/compiler/DependencyLock.ff +17 -0
  6. package/compiler/Deriver.ff +2 -1
  7. package/compiler/Dictionaries.ff +4 -4
  8. package/compiler/Environment.ff +3 -3
  9. package/compiler/Inference.ff +7 -7
  10. package/compiler/JsEmitter.ff +2 -2
  11. package/compiler/JsImporter.ff +2 -2
  12. package/compiler/LspHook.ff +2 -2
  13. package/compiler/Main.ff +22 -8
  14. package/compiler/ModuleCache.ff +6 -6
  15. package/compiler/Parser.ff +36 -36
  16. package/compiler/Resolver.ff +7 -7
  17. package/compiler/Syntax.ff +1 -1
  18. package/compiler/Tokenizer.ff +2 -2
  19. package/compiler/Unification.ff +3 -3
  20. package/compiler/Wildcards.ff +1 -1
  21. package/core/.firefly/include/package-lock.json +96 -96
  22. package/core/.firefly/include/package.json +1 -1
  23. package/core/Array.ff +2 -2
  24. package/core/Atomic.ff +1 -1
  25. package/core/Buffer.ff +1 -1
  26. package/core/Int.ff +2 -2
  27. package/core/IntMap.ff +4 -4
  28. package/core/Json.ff +5 -5
  29. package/core/List.ff +15 -15
  30. package/core/Map.ff +1 -1
  31. package/core/NodeSystem.ff +85 -0
  32. package/core/Option.ff +10 -3
  33. package/core/Random.ff +1 -1
  34. package/core/RbMap.ff +1 -1
  35. package/core/Serializable.ff +2 -2
  36. package/core/Set.ff +2 -2
  37. package/core/Stream.ff +4 -4
  38. package/core/StringMap.ff +4 -4
  39. package/experimental/random/Index.ff +53 -0
  40. package/experimental/random/MapTest.ff +2 -2
  41. package/experimental/random/Process.ff +120 -0
  42. package/experimental/random/RunLength.ff +2 -2
  43. package/experimental/random/Symbols.ff +2 -2
  44. package/lsp/CompletionHandler.ff +3 -6
  45. package/lsp/Handler.ff +45 -24
  46. package/lsp/LanguageServer.ff +13 -3
  47. package/lsp/SymbolHandler.ff +2 -2
  48. package/lsp/TestReferences.ff +2 -2
  49. package/lux/Lux.ff +6 -6
  50. package/output/js/ff/compiler/Builder.mjs +40 -28
  51. package/output/js/ff/compiler/Compiler.mjs +38 -14
  52. package/output/js/ff/compiler/Dependencies.mjs +30 -16
  53. package/output/js/ff/compiler/DependencyLock.mjs +128 -0
  54. package/output/js/ff/compiler/Deriver.mjs +4 -4
  55. package/output/js/ff/compiler/Dictionaries.mjs +8 -8
  56. package/output/js/ff/compiler/Environment.mjs +6 -6
  57. package/output/js/ff/compiler/Inference.mjs +12 -12
  58. package/output/js/ff/compiler/JsEmitter.mjs +4 -4
  59. package/output/js/ff/compiler/JsImporter.mjs +4 -4
  60. package/output/js/ff/compiler/LspHook.mjs +4 -4
  61. package/output/js/ff/compiler/Main.mjs +14 -12
  62. package/output/js/ff/compiler/ModuleCache.mjs +4 -4
  63. package/output/js/ff/compiler/Parser.mjs +72 -72
  64. package/output/js/ff/compiler/Resolver.mjs +14 -14
  65. package/output/js/ff/compiler/Syntax.mjs +2 -2
  66. package/output/js/ff/compiler/Tokenizer.mjs +4 -4
  67. package/output/js/ff/compiler/Unification.mjs +4 -4
  68. package/output/js/ff/compiler/Wildcards.mjs +2 -2
  69. package/output/js/ff/core/Array.mjs +5 -5
  70. package/output/js/ff/core/Atomic.mjs +3 -3
  71. package/output/js/ff/core/Buffer.mjs +3 -3
  72. package/output/js/ff/core/Int.mjs +4 -4
  73. package/output/js/ff/core/IntMap.mjs +9 -9
  74. package/output/js/ff/core/Json.mjs +10 -10
  75. package/output/js/ff/core/List.mjs +31 -31
  76. package/output/js/ff/core/Map.mjs +2 -2
  77. package/output/js/ff/core/NodeSystem.mjs +119 -0
  78. package/output/js/ff/core/Option.mjs +28 -2
  79. package/output/js/ff/core/Random.mjs +2 -2
  80. package/output/js/ff/core/RbMap.mjs +2 -2
  81. package/output/js/ff/core/Serializable.mjs +4 -4
  82. package/output/js/ff/core/Set.mjs +4 -4
  83. package/output/js/ff/core/Stream.mjs +8 -8
  84. package/output/js/ff/core/StringMap.mjs +9 -9
  85. package/package.json +1 -1
  86. package/postgresql/Pg.ff +2 -2
  87. package/rpc/Rpc.ff +3 -3
  88. package/vscode/package.json +1 -1
  89. package/webserver/WebServer.ff +2 -2
  90. package/httpserver/.firefly/package.ff +0 -1
  91. package/httpserver/HttpServer.ff +0 -184
@@ -1,184 +0,0 @@
1
- capability HttpRequest {}
2
- capability HttpResponse {}
3
-
4
- listen(system: NodeSystem, host: String, port: Int, handler: (HttpRequest, HttpResponse) => Unit): Unit
5
- target node async """
6
- import * as http from 'http'
7
- ff_core_Task.Task_throwIfAborted($task)
8
- const server = http.createServer(async (req, res) => {
9
- try {
10
- const channel = ff_core_Task.Task_channel($task)
11
- ff_core_Task.Task_spawn($task, async task => {
12
- try {
13
- await handler_(req, res, task)
14
- } finally {
15
- await ff_core_Channel.Channel_write$(channel, null, task)
16
- }
17
- })
18
- await ff_core_Channel.Channel_read$(channel, $task)
19
- if(!res.headersSent) res.writeHead(200, 'OK')
20
- } finally {
21
- if(!res.headersSent) res.writeHead(500, 'Internal Server Error')
22
- if(!res.writableEnded) res.end()
23
- }
24
- })
25
- await new Promise((resolve, reject) => {
26
- server.listen(port_, host_, error => {if(error != null) reject(error); else resolve()})
27
- })
28
- await new Promise((resolve, reject) => {
29
- const abort = () => {
30
- $task.controller.signal.removeEventListener('abort', abort)
31
- const reason = $task.controller.signal.reason
32
- $task.controller = new AbortController()
33
- server.close(() => reject(reason))
34
- }
35
- $task.controller.signal.addEventListener('abort', abort)
36
- })
37
- """
38
-
39
-
40
- extend self: HttpRequest {
41
-
42
- method(): String
43
- target node async "return self_.method"
44
-
45
- path(): String
46
- target node async """
47
- let i = self_.url.indexOf('?')
48
- return i === -1 ? self_.url : self_.url.slice(0, i)
49
- """
50
-
51
- parameters(): Option[String]
52
- target node async """
53
- let i = self_.url.indexOf('?')
54
- return i === -1 ? ff_core_Option.None() : ff_core_Option.Some(self_.url.slice(i + 1))
55
- """
56
-
57
- parameter(name: String): Option[String]
58
- target node async """
59
- let i = self_.url.indexOf('?')
60
- if(i === -1) return ff_core_Option.None()
61
- let ps = self_.url.slice(i + 1).split('&')
62
- let n = name_ + '='
63
- let r = ps.find(p => p === name_ || p.startsWith(n))
64
- if(r == null) return ff_core_Option.None()
65
- return ff_core_Option.Some(r.slice(name_.length + 1))
66
- """
67
-
68
- header(name: String): Option[String]
69
- target node async """
70
- let header = self_.headers[name_.toLowerCase()]
71
- if(header == null || header.length == 0) ff_core_Option.None()
72
- return ff_core_Option.Some(Array.isArray(header) ? header[0] : header)
73
- """
74
-
75
- encoding(): Option[String]
76
- target node async """
77
- return self_.readableEncoding ? ff_core_Option.Some(self_.readableEncoding) : ff_core_Option.None()
78
- """
79
-
80
- readText(encoding: Option[String] = None): String {
81
- self.readStream().toString(encoding.else {self.encoding().else {"utf8"}})
82
- }
83
-
84
- readBuffer(): Buffer {
85
- self.readStream().toBuffer()
86
- }
87
-
88
- readStream(): Stream[Buffer]
89
- target node async """
90
- import * as http from 'http'
91
- let task = null
92
- let readable = self_
93
- let doResolve = null
94
- let doReject = null
95
- let seenError = null
96
- const abort = () => {
97
- if(task != null) {
98
- task.controller.signal.removeEventListener('abort', abort)
99
- readable.destroy()
100
- }
101
- }
102
- function open($task) {
103
- ff_core_Task.Task_throwIfAborted($task)
104
- if(self_.streamWorkaround != null) throw new Error("Can't open HttpRequest body stream twice")
105
- task = $task
106
- self_.streamWorkaround = true
107
- readable.on('readable', () => {
108
- if(doResolve != null) doResolve()
109
- })
110
- readable.on('error', error => {
111
- task.controller.signal.removeEventListener('abort', abort)
112
- seenError = error
113
- if(doReject != null) doReject(error)
114
- })
115
- readable.on('close', () => {
116
- task.controller.signal.removeEventListener('abort', abort)
117
- if(doResolve != null) doResolve()
118
- })
119
- $task.controller.signal.addEventListener('abort', abort)
120
- }
121
- return ff_core_Stream.Stream(async function go($task) {
122
- if(task == null) open($task)
123
- let buffer = readable.read()
124
- if(buffer != null) return ff_core_Option.Some(buffer)
125
- if(seenError != null) throw seenError
126
- if(readable.destroyed) return ff_core_Option.None()
127
- let promise = new Promise((resolve, reject) => {
128
- doResolve = () => {doResolve = null; doReject = null; resolve()}
129
- doReject = error => {doResolve = null; doReject = null; reject(error)}
130
- }).then(() => go($task))
131
- return await promise
132
- }, abort)
133
- """
134
-
135
- }
136
-
137
- extend self: HttpResponse {
138
-
139
- setHeader(name: String, values: List[String]): Unit
140
- target node async "self_.setHeader(name_, ff_core_List.List_toArray(values_))"
141
-
142
- writeStatus(code: Int, message: Option[String]): Unit
143
- target node async "self_.writeHead(code_, message_.value_)"
144
-
145
- write(buffer: Buffer): Unit
146
- target node async """
147
- import * as http from 'http'
148
- ff_core_Task.Task_throwIfAborted($task)
149
- if(!self_.write(Buffer.from(buffer_.buffer))) {
150
- let reject = null;
151
- await new Promise((resolve, reject) => {
152
- const abort = () => {
153
- $task.controller.signal.removeEventListener('abort', abort)
154
- reject($task.controller.signal.reason)
155
- }
156
- $task.controller.signal.addEventListener('abort', abort)
157
- self_.once('drain', () => {
158
- $task.controller.signal.removeEventListener('abort', abort)
159
- resolve()
160
- })
161
- })
162
- }
163
- """
164
-
165
- writeText(text: String, encoding: String = "utf8"): Unit
166
- target node async """
167
- import * as http from 'http'
168
- ff_core_Task.Task_throwIfAborted($task)
169
- if(!self_.write(text_, encoding_)) {
170
- await new Promise((resolve, reject) => {
171
- const abort = () => {
172
- $task.controller.signal.removeEventListener('abort', abort)
173
- reject($task.controller.signal.reason)
174
- }
175
- $task.controller.signal.addEventListener('abort', abort)
176
- self_.once('drain', () => {
177
- $task.controller.signal.removeEventListener('abort', abort)
178
- resolve()
179
- })
180
- })
181
- }
182
- """
183
-
184
- }