firefly-compiler 0.4.79 → 0.4.80

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 (158) hide show
  1. package/.hintrc +4 -4
  2. package/.vscode/settings.json +4 -4
  3. package/bin/Release.ff +153 -153
  4. package/bin/firefly.mjs +1 -1
  5. package/compiler/Builder.ff +257 -257
  6. package/compiler/Compiler.ff +227 -227
  7. package/compiler/Dependencies.ff +187 -187
  8. package/compiler/DependencyLock.ff +17 -17
  9. package/compiler/Inference.ff +2 -1
  10. package/compiler/JsEmitter.ff +940 -946
  11. package/compiler/LspHook.ff +202 -202
  12. package/compiler/Main.ff +3 -3
  13. package/compiler/ModuleCache.ff +178 -178
  14. package/compiler/Tokenizer.ff +1 -1
  15. package/compiler/Unification.ff +1 -1
  16. package/compiler/Workspace.ff +88 -88
  17. package/core/.firefly/include/package-lock.json +564 -564
  18. package/core/.firefly/include/package.json +5 -5
  19. package/core/.firefly/include/prepare.sh +1 -1
  20. package/core/.firefly/package.ff +2 -2
  21. package/core/Array.ff +265 -265
  22. package/core/Atomic.ff +64 -64
  23. package/core/Box.ff +7 -7
  24. package/core/BrowserSystem.ff +40 -40
  25. package/core/BuildSystem.ff +148 -148
  26. package/core/Crypto.ff +96 -96
  27. package/core/Equal.ff +36 -36
  28. package/core/Float.ff +25 -0
  29. package/core/HttpClient.ff +148 -148
  30. package/core/JsSystem.ff +69 -69
  31. package/core/Json.ff +434 -434
  32. package/core/List.ff +486 -486
  33. package/core/Lock.ff +144 -144
  34. package/core/NodeSystem.ff +216 -216
  35. package/core/Ordering.ff +161 -161
  36. package/core/Path.ff +401 -401
  37. package/core/Random.ff +134 -134
  38. package/core/RbMap.ff +216 -216
  39. package/core/Show.ff +43 -43
  40. package/core/SourceLocation.ff +68 -68
  41. package/core/Stream.ff +9 -9
  42. package/core/Task.ff +141 -141
  43. package/core/Try.ff +25 -4
  44. package/experimental/benchmarks/ListGrab.ff +23 -23
  45. package/experimental/benchmarks/ListGrab.java +55 -55
  46. package/experimental/benchmarks/Pyrotek45.ff +30 -30
  47. package/experimental/benchmarks/Pyrotek45.java +64 -64
  48. package/experimental/bidirectional/Bidi.ff +88 -88
  49. package/experimental/random/Index.ff +53 -53
  50. package/experimental/random/Process.ff +120 -120
  51. package/experimental/random/Scrape.ff +51 -51
  52. package/experimental/random/Symbols.ff +73 -73
  53. package/experimental/random/Tensor.ff +52 -52
  54. package/experimental/random/Units.ff +36 -36
  55. package/experimental/s3/S3TestAuthorizationHeader.ff +39 -39
  56. package/experimental/s3/S3TestPut.ff +16 -16
  57. package/experimental/tests/TestJson.ff +26 -26
  58. package/firefly.sh +0 -0
  59. package/fireflysite/.firefly/package.ff +4 -4
  60. package/fireflysite/CommunityOverview.ff +20 -20
  61. package/fireflysite/CountingButtonDemo.ff +58 -58
  62. package/fireflysite/DocumentParser.ff +331 -217
  63. package/fireflysite/ExamplesOverview.ff +40 -40
  64. package/fireflysite/FrontPage.ff +344 -360
  65. package/fireflysite/{GuideIntroduction.ff → GettingStarted.ff} +45 -52
  66. package/fireflysite/Guide.ff +443 -411
  67. package/fireflysite/Main.ff +141 -137
  68. package/fireflysite/MatchingPasswordsDemo.ff +82 -82
  69. package/fireflysite/PackagesOverview.ff +49 -49
  70. package/fireflysite/PostgresqlDemo.ff +34 -34
  71. package/fireflysite/ReferenceAll.ff +19 -0
  72. package/fireflysite/ReferenceIntroduction.ff +11 -0
  73. package/fireflysite/Styles.ff +567 -495
  74. package/fireflysite/Test.ff +38 -0
  75. package/fireflysite/assets/markdown/reference/BaseTypes.md +209 -0
  76. package/fireflysite/assets/markdown/reference/FunctionsAndMethods.md +208 -0
  77. package/fireflysite/assets/markdown/reference/ModulesAndPackages.md +168 -0
  78. package/fireflysite/assets/markdown/reference/PatternMatching.md +224 -0
  79. package/fireflysite/assets/markdown/reference/StatementsAndExpressions.md +86 -0
  80. package/fireflysite/assets/markdown/reference/TraitsAndInstances.md +100 -0
  81. package/fireflysite/assets/markdown/reference/UserDefinedTypes.md +184 -0
  82. package/fireflysite/assets/markdown/{ControlFlow.md → scratch/ControlFlow.md} +136 -136
  83. package/fireflysite/assets/markdown/scratch/Toc.md +41 -0
  84. package/lsp/.firefly/package.ff +1 -1
  85. package/lsp/CompletionHandler.ff +828 -828
  86. package/lsp/Handler.ff +714 -714
  87. package/lsp/HoverHandler.ff +79 -79
  88. package/lsp/LanguageServer.ff +272 -272
  89. package/lsp/SignatureHelpHandler.ff +55 -55
  90. package/lsp/SymbolHandler.ff +181 -181
  91. package/lsp/TestReferences.ff +17 -17
  92. package/lsp/TestReferencesCase.ff +7 -7
  93. package/lsp/stderr.txt +1 -1
  94. package/lsp/stdout.txt +34 -34
  95. package/lux/.firefly/package.ff +1 -1
  96. package/lux/Css.ff +648 -648
  97. package/lux/CssTest.ff +48 -48
  98. package/lux/Lux.ff +487 -487
  99. package/lux/LuxEvent.ff +116 -116
  100. package/lux/Main.ff +123 -123
  101. package/lux/Main2.ff +143 -143
  102. package/output/js/ff/compiler/Builder.mjs +47 -47
  103. package/output/js/ff/compiler/Dependencies.mjs +3 -3
  104. package/output/js/ff/compiler/Inference.mjs +2 -2
  105. package/output/js/ff/compiler/JsEmitter.mjs +18 -72
  106. package/output/js/ff/compiler/Main.mjs +4 -4
  107. package/output/js/ff/compiler/ModuleCache.mjs +4 -4
  108. package/output/js/ff/core/Array.mjs +59 -59
  109. package/output/js/ff/core/Atomic.mjs +36 -36
  110. package/output/js/ff/core/BrowserSystem.mjs +11 -11
  111. package/output/js/ff/core/BuildSystem.mjs +30 -30
  112. package/output/js/ff/core/Crypto.mjs +40 -40
  113. package/output/js/ff/core/Float.mjs +50 -0
  114. package/output/js/ff/core/HttpClient.mjs +56 -56
  115. package/output/js/ff/core/Json.mjs +147 -147
  116. package/output/js/ff/core/List.mjs +50 -50
  117. package/output/js/ff/core/Lock.mjs +97 -97
  118. package/output/js/ff/core/NodeSystem.mjs +87 -87
  119. package/output/js/ff/core/Ordering.mjs +8 -8
  120. package/output/js/ff/core/Path.mjs +231 -231
  121. package/output/js/ff/core/Random.mjs +56 -56
  122. package/output/js/ff/core/Task.mjs +39 -39
  123. package/output/js/ff/core/Try.mjs +98 -4
  124. package/package.json +1 -1
  125. package/postgresql/Pg.ff +1 -1
  126. package/rpc/.firefly/package.ff +1 -1
  127. package/rpc/Rpc.ff +70 -70
  128. package/s3/.firefly/package.ff +1 -1
  129. package/s3/S3.ff +94 -94
  130. package/unsafejs/UnsafeJs.ff +19 -19
  131. package/vscode/LICENSE.txt +21 -21
  132. package/vscode/Prepublish.ff +15 -15
  133. package/vscode/README.md +16 -16
  134. package/vscode/client/package.json +22 -22
  135. package/vscode/client/src/extension.ts +104 -104
  136. package/vscode/icons/firefly-icon.svg +10 -10
  137. package/vscode/language-configuration.json +61 -61
  138. package/vscode/package-lock.json +3623 -3623
  139. package/vscode/package.json +1 -1
  140. package/vscode/snippets.json +241 -241
  141. package/vscode/syntaxes/firefly-markdown-injection.json +45 -45
  142. package/webserver/.firefly/include/package-lock.json +22 -22
  143. package/webserver/.firefly/include/package.json +5 -5
  144. package/webserver/.firefly/package.ff +2 -2
  145. package/webserver/WebServer.ff +685 -685
  146. package/websocket/.firefly/package.ff +1 -1
  147. package/websocket/WebSocket.ff +131 -131
  148. package/fireflysite/GuideAll.ff +0 -21
  149. package/fireflysite/GuideBaseTypes.ff +0 -168
  150. package/fireflysite/GuideControlFlow.ff +0 -212
  151. package/fireflysite/assets/markdown/Example.md +0 -78
  152. /package/fireflysite/assets/{NotoSansMono-Regular.ttf → font/NotoSansMono-Regular.ttf} +0 -0
  153. /package/fireflysite/assets/{NunitoSans-VariableFont_YTLC,opsz,wdth,wght.ttf → font/NunitoSans-VariableFont_YTLC,opsz,wdth,wght.ttf} +0 -0
  154. /package/fireflysite/assets/{autocomplete-small.png → image/autocomplete-small.png} +0 -0
  155. /package/fireflysite/assets/{autocomplete.png → image/autocomplete.png} +0 -0
  156. /package/fireflysite/assets/{edit-time-error.png → image/edit-time-error.png} +0 -0
  157. /package/fireflysite/assets/{firefly-logo-notext.png → image/firefly-logo-notext.png} +0 -0
  158. /package/fireflysite/assets/{firefly-logo-yellow.png → image/firefly-logo-yellow.png} +0 -0
package/core/Stream.ff CHANGED
@@ -42,7 +42,7 @@ extend self[T]: Stream[T] {
42
42
  self.close()
43
43
  } finally {
44
44
  that.close()
45
- } grab()
45
+ }
46
46
  }
47
47
  }
48
48
 
@@ -76,7 +76,7 @@ extend self[T]: Stream[T] {
76
76
  inner.close()
77
77
  } finally {
78
78
  self.close()
79
- } grab()
79
+ }
80
80
  }
81
81
  }
82
82
 
@@ -111,7 +111,7 @@ extend self[T]: Stream[T] {
111
111
  self.close()
112
112
  } finally {
113
113
  that.close()
114
- } grab()
114
+ }
115
115
  }
116
116
  }
117
117
 
@@ -224,7 +224,7 @@ extend self[T]: Stream[T] {
224
224
  body(self)
225
225
  } finally {
226
226
  self.close()
227
- } grab()
227
+ }
228
228
  }
229
229
 
230
230
  each(body: T => Unit): Unit {
@@ -238,7 +238,7 @@ extend self[T]: Stream[T] {
238
238
  }
239
239
  } finally {
240
240
  self.close()
241
- } grab()
241
+ }
242
242
  }
243
243
 
244
244
  eachWhile(body: T => Bool): Unit {
@@ -252,7 +252,7 @@ extend self[T]: Stream[T] {
252
252
  }
253
253
  } finally {
254
254
  self.close()
255
- } grab()
255
+ }
256
256
  }
257
257
 
258
258
  all(body: T => Bool): Bool {
@@ -278,7 +278,7 @@ extend self[T]: Stream[T] {
278
278
  self.next()
279
279
  } finally {
280
280
  self.close()
281
- } grab()
281
+ }
282
282
  }
283
283
 
284
284
  last(): Option[T] {
@@ -294,7 +294,7 @@ extend self[T]: Stream[T] {
294
294
  result
295
295
  } finally {
296
296
  self.close()
297
- } grab()
297
+ }
298
298
  }
299
299
 
300
300
  grabFirst(): T {
@@ -324,7 +324,7 @@ extend self[T]: Stream[T] {
324
324
  result
325
325
  } finally {
326
326
  self.close()
327
- } grab()
327
+ }
328
328
  }
329
329
 
330
330
  find(body: T => Bool): Option[T] {
package/core/Task.ff CHANGED
@@ -1,141 +1,141 @@
1
- capability Task {}
2
-
3
- extend self: Task {
4
- // Spawns a task running body. The return value as well as the argument to body is the task handle.
5
- // Automatically aborts and then joins subtasks when body returns or throws an unhandled exception.
6
- // If body throws, the parent task is also aborted with the dueToSubtask flag set to true.
7
- spawn(body: Task => Unit): Task
8
- target js async """
9
- return ff_core_Task.Task_spawn(self_, body_)
10
- """
11
- target js sync """
12
- ff_core_Task.Task_throwIfAborted(self_)
13
- const task = {controller: new AbortController(), subtasks: new Set(), started: performance.now() * 0.001}
14
- self_.subtasks.add(task)
15
- task.promise = Promise.resolve(task).then(async () => {
16
- try {
17
- await body_(task, task)
18
- } catch(e) {
19
- await ff_core_Task.Task_abort$(self_)
20
- throw e
21
- } finally {
22
- for(const subtask of task.subtasks) subtask.controller.abort()
23
- await Promise.allSettled([...task.subtasks].map(subtask => subtask.promise))
24
- self_.subtasks.delete(task)
25
- }
26
- })
27
- return task
28
- """
29
-
30
- // If the aborted flag is set for the current task, clears it and throws TaskAbortedException.
31
- // You don't normally need to call this, but you might want to before doing an expensive computation.
32
- throwIfAborted(): Unit
33
- target js async """
34
- ff_core_Task.Task_throwIfAborted(self_)
35
- """
36
- target js sync """
37
- if(self_.controller.signal.aborted) {
38
- const signal = self_.controller.signal
39
- self_.controller = new AbortController()
40
- signal.throwIfAborted()
41
- }
42
- """
43
-
44
- // Sets the tasks aborted flag, which causes the ongoing/next async call to throw TaskAbortedException.
45
- abort(): Unit
46
- target js async """
47
- self_.controller.abort()
48
- """
49
- target js sync """
50
- self_.controller.abort()
51
- """
52
-
53
- // Create a blocking channel with the specified capacity. The channel is not tied to the task.
54
- channel[T](capacity: Int = 0): Channel[T]
55
- target js async """return ff_core_Task.Task_channel(capacity_)"""
56
- target js sync """return {capacity: capacity_, buffer: [], readers: new Set(), writers: new Set()}"""
57
-
58
- // Create a mutex. The mutex is not tied to the task.
59
- lock(): Lock
60
- target js async """return {owner: null, level: 0, stack: [], queue: []}"""
61
-
62
- now(): Instant
63
- target js sync "return Date.now() * 0.001"
64
- target js async "return Date.now() * 0.001" // TODO: Mark now() as sync and remove async version
65
-
66
- elapsed(): Duration
67
- target js sync "return performance.now() * 0.001 - self_.started"
68
- target js async "return performance.now() * 0.001 - self_.started" // TODO: Mark sync and remove async version
69
-
70
- time[R](body: () => R): Pair[R, Duration] {
71
- let start = self.elapsed()
72
- let result = body()
73
- let stop = self.elapsed()
74
- let duration = Duration(stop.seconds - start.seconds)
75
- Pair(result, duration)
76
- }
77
-
78
- }
79
-
80
- // Convenience methods
81
- extend self: Task {
82
-
83
- sleep(duration: Duration): Unit {
84
- Channel.
85
- readOr(self.channel()) {_ => }.
86
- timeout(duration) {}
87
- }
88
-
89
- all[T](tasks: List[() => T]): List[T] {
90
- let successChannel = self.channel()
91
- let failureChannel = self.channel()
92
- self.spawn {t =>
93
- let channel = t.channel()
94
- try {
95
- tasks.pairs().each {| Pair(i, task) =>
96
- t.spawn {_ =>
97
- channel.write(Pair(i, task()))
98
- }
99
- }
100
- let result = tasks.map {_ =>
101
- channel.read()
102
- }.sortBy {_.first}.map {_.second}
103
- successChannel.write(result)
104
- } catchAny {error =>
105
- failureChannel.write(error)
106
- t.abort()
107
- } grab()
108
- }
109
- Channel.
110
- readOr(successChannel, {_}).
111
- readOr(failureChannel, {_.rethrow()}).
112
- wait()
113
- }
114
-
115
- race[T](tasks: List[() => T]): T {
116
- let successChannel = self.channel()
117
- let failureChannel = self.channel()
118
- mutable live = tasks.size()
119
- let started = tasks.map {task =>
120
- self.spawn {_ =>
121
- try {
122
- successChannel.write(task())
123
- } catchAny {e =>
124
- live -= 1 // Not thread safe (but OK in JS)
125
- if(live == 0) {
126
- failureChannel.write(e)
127
- }
128
- } grab()
129
- }
130
- }
131
- try {
132
- Channel.
133
- readOr(successChannel, {_}).
134
- readOr(failureChannel, {_.rethrow()}).
135
- wait()
136
- } finally {
137
- started.each {_.abort()}
138
- } grab()
139
- }
140
-
141
- }
1
+ capability Task {}
2
+
3
+ extend self: Task {
4
+ // Spawns a task running body. The return value as well as the argument to body is the task handle.
5
+ // Automatically aborts and then joins subtasks when body returns or throws an unhandled exception.
6
+ // If body throws, the parent task is also aborted with the dueToSubtask flag set to true.
7
+ spawn(body: Task => Unit): Task
8
+ target js async """
9
+ return ff_core_Task.Task_spawn(self_, body_)
10
+ """
11
+ target js sync """
12
+ ff_core_Task.Task_throwIfAborted(self_)
13
+ const task = {controller: new AbortController(), subtasks: new Set(), started: performance.now() * 0.001}
14
+ self_.subtasks.add(task)
15
+ task.promise = Promise.resolve(task).then(async () => {
16
+ try {
17
+ await body_(task, task)
18
+ } catch(e) {
19
+ await ff_core_Task.Task_abort$(self_)
20
+ throw e
21
+ } finally {
22
+ for(const subtask of task.subtasks) subtask.controller.abort()
23
+ await Promise.allSettled([...task.subtasks].map(subtask => subtask.promise))
24
+ self_.subtasks.delete(task)
25
+ }
26
+ })
27
+ return task
28
+ """
29
+
30
+ // If the aborted flag is set for the current task, clears it and throws TaskAbortedException.
31
+ // You don't normally need to call this, but you might want to before doing an expensive computation.
32
+ throwIfAborted(): Unit
33
+ target js async """
34
+ ff_core_Task.Task_throwIfAborted(self_)
35
+ """
36
+ target js sync """
37
+ if(self_.controller.signal.aborted) {
38
+ const signal = self_.controller.signal
39
+ self_.controller = new AbortController()
40
+ signal.throwIfAborted()
41
+ }
42
+ """
43
+
44
+ // Sets the tasks aborted flag, which causes the ongoing/next async call to throw TaskAbortedException.
45
+ abort(): Unit
46
+ target js async """
47
+ self_.controller.abort()
48
+ """
49
+ target js sync """
50
+ self_.controller.abort()
51
+ """
52
+
53
+ // Create a blocking channel with the specified capacity. The channel is not tied to the task.
54
+ channel[T](capacity: Int = 0): Channel[T]
55
+ target js async """return ff_core_Task.Task_channel(capacity_)"""
56
+ target js sync """return {capacity: capacity_, buffer: [], readers: new Set(), writers: new Set()}"""
57
+
58
+ // Create a mutex. The mutex is not tied to the task.
59
+ lock(): Lock
60
+ target js async """return {owner: null, level: 0, stack: [], queue: []}"""
61
+
62
+ now(): Instant
63
+ target js sync "return Date.now() * 0.001"
64
+ target js async "return Date.now() * 0.001" // TODO: Mark now() as sync and remove async version
65
+
66
+ elapsed(): Duration
67
+ target js sync "return performance.now() * 0.001 - self_.started"
68
+ target js async "return performance.now() * 0.001 - self_.started" // TODO: Mark sync and remove async version
69
+
70
+ time[R](body: () => R): Pair[R, Duration] {
71
+ let start = self.elapsed()
72
+ let result = body()
73
+ let stop = self.elapsed()
74
+ let duration = Duration(stop.seconds - start.seconds)
75
+ Pair(result, duration)
76
+ }
77
+
78
+ }
79
+
80
+ // Convenience methods
81
+ extend self: Task {
82
+
83
+ sleep(duration: Duration): Unit {
84
+ Channel.
85
+ readOr(self.channel()) {_ => }.
86
+ timeout(duration) {}
87
+ }
88
+
89
+ all[T](tasks: List[() => T]): List[T] {
90
+ let successChannel = self.channel()
91
+ let failureChannel = self.channel()
92
+ self.spawn {t =>
93
+ let channel = t.channel()
94
+ try {
95
+ tasks.pairs().each {| Pair(i, task) =>
96
+ t.spawn {_ =>
97
+ channel.write(Pair(i, task()))
98
+ }
99
+ }
100
+ let result = tasks.map {_ =>
101
+ channel.read()
102
+ }.sortBy {_.first}.map {_.second}
103
+ successChannel.write(result)
104
+ } catchAny {error =>
105
+ failureChannel.write(error)
106
+ t.abort()
107
+ }
108
+ }
109
+ Channel.
110
+ readOr(successChannel, {_}).
111
+ readOr(failureChannel, {_.rethrow()}).
112
+ wait()
113
+ }
114
+
115
+ race[T](tasks: List[() => T]): T {
116
+ let successChannel = self.channel()
117
+ let failureChannel = self.channel()
118
+ mutable live = tasks.size()
119
+ let started = tasks.map {task =>
120
+ self.spawn {_ =>
121
+ try {
122
+ successChannel.write(task())
123
+ } catchAny {e =>
124
+ live -= 1 // Not thread safe (but OK in JS)
125
+ if(live == 0) {
126
+ failureChannel.write(e)
127
+ }
128
+ }
129
+ }
130
+ }
131
+ try {
132
+ Channel.
133
+ readOr(successChannel, {_}).
134
+ readOr(failureChannel, {_.rethrow()}).
135
+ wait()
136
+ } finally {
137
+ started.each {_.abort()}
138
+ }
139
+ }
140
+
141
+ }
package/core/Try.ff CHANGED
@@ -16,21 +16,42 @@ extend self[T]: Try[T] {
16
16
  self.map(body).flatten()
17
17
  }
18
18
 
19
- catch[E: HasAnyTag](body: (E, Error) => T): Try[T] {
19
+ catch[E: HasAnyTag](body: (E, Error) => T): T {
20
+ self.{
21
+ | Failure(error) {error.exception().flatMap(Any.fromAny) | Some(e)} => body(e, error)
22
+ | _ => self.grab()
23
+ }
24
+ }
25
+
26
+ catchAny(body: Error => T): T {
27
+ self.{
28
+ | Failure(error) => body(error)
29
+ | _ => self.grab()
30
+ }
31
+ }
32
+
33
+ finally(body: () => Unit): T {
34
+ self.{
35
+ | Success(value) => body(); value
36
+ | Failure(_) => body(); self.grab()
37
+ }
38
+ }
39
+
40
+ tryCatch[E: HasAnyTag](body: (E, Error) => T): Try[T] {
20
41
  self.{
21
42
  | Failure(error) {error.exception().flatMap(Any.fromAny) | Some(e)} => try {body(e, error)}
22
43
  | _ => self
23
44
  }
24
45
  }
25
46
 
26
- catchAny(body: Error => T): Try[T] {
47
+ tryCatchAny(body: Error => T): Try[T] {
27
48
  self.{
28
49
  | Failure(error) => try {body(error)}
29
50
  | _ => self
30
51
  }
31
52
  }
32
53
 
33
- finally(body: () => Unit): Try[T] {
54
+ tryFinally(body: () => Unit): Try[T] {
34
55
  self.{
35
56
  | Success(value) => try {body(); value}
36
57
  | Failure(_) =>
@@ -40,7 +61,7 @@ extend self[T]: Try[T] {
40
61
  }
41
62
  }
42
63
  }
43
-
64
+
44
65
  else(body: () => T): T {
45
66
  self.{
46
67
  | Success(value) => value
@@ -1,23 +1,23 @@
1
- nodeMain(system: NodeSystem) {
2
- let list = 1.to(10000)
3
- benchmark(list, 100000)
4
- let time = system.mainTask().time {
5
- benchmark(list, 100000)
6
- }
7
- Log.trace(time.second.show())
8
- }
9
-
10
- benchmark(list: List[Int], iterations: Int): Int {
11
- mutable sum = 0
12
- mutable i = 0
13
- while {i < iterations} {
14
- mutable j = 0
15
- sum = 0
16
- while {j < 10000} {
17
- sum += list.grab(j)
18
- j += 1
19
- }
20
- i += 1
21
- }
22
- sum
23
- }
1
+ nodeMain(system: NodeSystem) {
2
+ let list = 1.to(10000)
3
+ benchmark(list, 100000)
4
+ let time = system.mainTask().time {
5
+ benchmark(list, 100000)
6
+ }
7
+ Log.trace(time.second.show())
8
+ }
9
+
10
+ benchmark(list: List[Int], iterations: Int): Int {
11
+ mutable sum = 0
12
+ mutable i = 0
13
+ while {i < iterations} {
14
+ mutable j = 0
15
+ sum = 0
16
+ while {j < 10000} {
17
+ sum += list.grab(j)
18
+ j += 1
19
+ }
20
+ i += 1
21
+ }
22
+ sum
23
+ }
@@ -1,55 +1,55 @@
1
- /*
2
-
3
- nodeMain(system: NodeSystem) {
4
- let list = 1.to(10000)
5
- benchmark(list, 10000)
6
- let time = system.mainTask().time {
7
- benchmark(list, 10000)
8
- }
9
- Log.trace(time.second.show())
10
- }
11
-
12
- benchmark(list: List[Int], iterations: Int): Int {
13
- mutable sum = 0
14
- mutable i = 0
15
- while {i < iterations} {
16
- mutable j = 0
17
- while {j < 10000} {
18
- sum += list.grab(j)
19
- j += 1
20
- }
21
- i += 1
22
- }
23
- sum
24
- }
25
-
26
- */
27
-
28
- // Rewrite the above to Java
29
-
30
- import java.util.ArrayList;
31
-
32
- public class ListGrab {
33
- public static void main(String[] args) {
34
- ArrayList<Integer> list = new ArrayList<>();
35
- for (int i = 1; i <= 10000; i++) {
36
- list.add(i);
37
- }
38
- benchmark(list, 100000);
39
- long time = System.currentTimeMillis();
40
- benchmark(list, 100000);
41
- time = System.currentTimeMillis() - time;
42
- System.out.println(time / 1000.0);
43
- }
44
-
45
- public static long benchmark(ArrayList<Integer> list, int iterations) {
46
- long sum = 0;
47
- for (int i = 0; i < iterations; i++) {
48
- sum = 0;
49
- for (int j = 0; j < 10000; j++) {
50
- sum += list.get(j);
51
- }
52
- }
53
- return sum;
54
- }
55
- }
1
+ /*
2
+
3
+ nodeMain(system: NodeSystem) {
4
+ let list = 1.to(10000)
5
+ benchmark(list, 10000)
6
+ let time = system.mainTask().time {
7
+ benchmark(list, 10000)
8
+ }
9
+ Log.trace(time.second.show())
10
+ }
11
+
12
+ benchmark(list: List[Int], iterations: Int): Int {
13
+ mutable sum = 0
14
+ mutable i = 0
15
+ while {i < iterations} {
16
+ mutable j = 0
17
+ while {j < 10000} {
18
+ sum += list.grab(j)
19
+ j += 1
20
+ }
21
+ i += 1
22
+ }
23
+ sum
24
+ }
25
+
26
+ */
27
+
28
+ // Rewrite the above to Java
29
+
30
+ import java.util.ArrayList;
31
+
32
+ public class ListGrab {
33
+ public static void main(String[] args) {
34
+ ArrayList<Integer> list = new ArrayList<>();
35
+ for (int i = 1; i <= 10000; i++) {
36
+ list.add(i);
37
+ }
38
+ benchmark(list, 100000);
39
+ long time = System.currentTimeMillis();
40
+ benchmark(list, 100000);
41
+ time = System.currentTimeMillis() - time;
42
+ System.out.println(time / 1000.0);
43
+ }
44
+
45
+ public static long benchmark(ArrayList<Integer> list, int iterations) {
46
+ long sum = 0;
47
+ for (int i = 0; i < iterations; i++) {
48
+ sum = 0;
49
+ for (int j = 0; j < 10000; j++) {
50
+ sum += list.get(j);
51
+ }
52
+ }
53
+ return sum;
54
+ }
55
+ }
@@ -1,30 +1,30 @@
1
- nodeMain(system: NodeSystem) {
2
- benchmark()
3
- let time = system.mainTask().time {
4
- benchmark()
5
- }
6
- Log.trace(time.second.show())
7
- }
8
-
9
- benchmark() {
10
- mutable num = 20000
11
- let v = num
12
- mutable i = 1
13
- mutable j = 1
14
- mutable sum = 0
15
- while {i < v} {
16
- j = 1
17
- while {j < num - 1} {
18
- if(num % j == 0) {
19
- sum += j
20
- }
21
- j += 1
22
- }
23
- if(num == sum) {
24
- Log.show(sum)
25
- }
26
- sum = 0
27
- num -= 1
28
- i += 1
29
- }
30
- }
1
+ nodeMain(system: NodeSystem) {
2
+ benchmark()
3
+ let time = system.mainTask().time {
4
+ benchmark()
5
+ }
6
+ Log.trace(time.second.show())
7
+ }
8
+
9
+ benchmark() {
10
+ mutable num = 20000
11
+ let v = num
12
+ mutable i = 1
13
+ mutable j = 1
14
+ mutable sum = 0
15
+ while {i < v} {
16
+ j = 1
17
+ while {j < num - 1} {
18
+ if(num % j == 0) {
19
+ sum += j
20
+ }
21
+ j += 1
22
+ }
23
+ if(num == sum) {
24
+ Log.show(sum)
25
+ }
26
+ sum = 0
27
+ num -= 1
28
+ i += 1
29
+ }
30
+ }