firefly-compiler 0.5.39 → 0.5.40
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.
- package/.hintrc +4 -4
- package/.vscode/settings.json +4 -4
- package/bin/Release.ff +157 -157
- package/bin/firefly.mjs +1 -1
- package/compiler/Builder.ff +275 -275
- package/compiler/Compiler.ff +234 -234
- package/compiler/Dependencies.ff +186 -186
- package/compiler/DependencyLock.ff +17 -17
- package/compiler/JsEmitter.ff +1437 -1437
- package/compiler/LspHook.ff +202 -202
- package/compiler/ModuleCache.ff +178 -178
- package/compiler/Workspace.ff +88 -88
- package/core/.firefly/include/package.json +5 -5
- package/core/.firefly/package.ff +2 -2
- package/core/Any.ff +25 -25
- package/core/Array.ff +298 -298
- package/core/Atomic.ff +63 -63
- package/core/Box.ff +7 -7
- package/core/BrowserSystem.ff +40 -40
- package/core/BuildSystem.ff +156 -156
- package/core/Crypto.ff +94 -94
- package/core/Equal.ff +41 -41
- package/core/Error.ff +25 -25
- package/core/HttpClient.ff +142 -142
- package/core/Instant.ff +24 -24
- package/core/Js.ff +305 -305
- package/core/JsSystem.ff +135 -135
- package/core/Json.ff +423 -423
- package/core/List.ff +482 -482
- package/core/Lock.ff +108 -108
- package/core/NodeSystem.ff +198 -198
- package/core/Ordering.ff +160 -160
- package/core/Path.ff +377 -378
- package/core/Queue.ff +90 -90
- package/core/Random.ff +140 -140
- package/core/RbMap.ff +216 -216
- package/core/Show.ff +44 -44
- package/core/SourceLocation.ff +68 -68
- package/core/Task.ff +165 -165
- package/experimental/benchmarks/ListGrab.ff +23 -23
- package/experimental/benchmarks/ListGrab.java +55 -55
- package/experimental/benchmarks/Pyrotek45.ff +30 -30
- package/experimental/benchmarks/Pyrotek45.java +64 -64
- package/experimental/bidirectional/Bidi.ff +88 -88
- package/experimental/lines/Main.ff +40 -40
- package/experimental/random/Index.ff +53 -53
- package/experimental/random/Process.ff +120 -120
- package/experimental/random/RunLength.ff +65 -65
- package/experimental/random/Scrape.ff +51 -51
- package/experimental/random/Symbols.ff +73 -73
- package/experimental/random/Tensor.ff +52 -52
- package/experimental/random/Units.ff +36 -36
- package/experimental/s3/S3TestAuthorizationHeader.ff +39 -39
- package/experimental/s3/S3TestPut.ff +16 -16
- package/experimental/tests/TestJson.ff +26 -26
- package/firefly.sh +0 -0
- package/fireflysite/.firefly/package.ff +4 -4
- package/fireflysite/CommunityOverview.ff +20 -20
- package/fireflysite/CountingButtonDemo.ff +58 -58
- package/fireflysite/DocumentParser.ff +325 -325
- package/fireflysite/ExamplesOverview.ff +40 -40
- package/fireflysite/FrontPage.ff +344 -344
- package/fireflysite/GettingStarted.ff +45 -45
- package/fireflysite/Guide.ff +456 -456
- package/fireflysite/Main.ff +163 -163
- package/fireflysite/MatchingPasswordsDemo.ff +82 -82
- package/fireflysite/PackagesOverview.ff +49 -49
- package/fireflysite/PostgresqlDemo.ff +34 -34
- package/fireflysite/ReferenceAll.ff +18 -18
- package/fireflysite/ReferenceIntroduction.ff +11 -11
- package/fireflysite/Styles.ff +567 -567
- package/fireflysite/Test.ff +121 -121
- package/fireflysite/assets/markdown/reference/BaseTypes.md +209 -209
- package/fireflysite/assets/markdown/reference/EmittedJavascript.md +65 -65
- package/fireflysite/assets/markdown/reference/Exceptions.md +101 -101
- package/fireflysite/assets/markdown/reference/FunctionsAndMethods.md +364 -364
- package/fireflysite/assets/markdown/reference/JavascriptInterop.md +235 -235
- package/fireflysite/assets/markdown/reference/ModulesAndPackages.md +162 -162
- package/fireflysite/assets/markdown/reference/OldStructuredConcurrency.md +48 -48
- package/fireflysite/assets/markdown/reference/PatternMatching.md +224 -224
- package/fireflysite/assets/markdown/reference/StatementsAndExpressions.md +86 -86
- package/fireflysite/assets/markdown/reference/StructuredConcurrency.md +99 -99
- package/fireflysite/assets/markdown/reference/TraitsAndInstances.md +100 -100
- package/fireflysite/assets/markdown/reference/UserDefinedTypes.md +184 -184
- package/fireflysite/assets/markdown/scratch/ControlFlow.md +136 -136
- package/fireflysite/assets/markdown/scratch/Toc.md +40 -40
- package/lsp/.firefly/package.ff +1 -1
- package/lsp/CompletionHandler.ff +827 -827
- package/lsp/Handler.ff +714 -714
- package/lsp/HoverHandler.ff +79 -79
- package/lsp/LanguageServer.ff +272 -272
- package/lsp/SignatureHelpHandler.ff +55 -55
- package/lsp/SymbolHandler.ff +181 -181
- package/lsp/TestReferences.ff +17 -17
- package/lsp/TestReferencesCase.ff +7 -7
- package/lsp/stderr.txt +1 -1
- package/lsp/stdout.txt +34 -34
- package/lux/.firefly/package.ff +1 -1
- package/lux/Css.ff +648 -648
- package/lux/CssTest.ff +48 -48
- package/lux/Lux.ff +608 -608
- package/lux/LuxEvent.ff +79 -79
- package/lux/Main.ff +123 -123
- package/lux/Main2.ff +143 -143
- package/lux/TestDry.ff +28 -28
- package/output/js/ff/compiler/Builder.mjs +36 -36
- package/output/js/ff/core/Path.mjs +0 -2
- package/package.json +1 -1
- package/rpc/.firefly/package.ff +1 -1
- package/rpc/Rpc.ff +70 -70
- package/s3/.firefly/package.ff +1 -1
- package/s3/S3.ff +92 -92
- package/vscode/LICENSE.txt +21 -21
- package/vscode/Prepublish.ff +15 -15
- package/vscode/README.md +16 -16
- package/vscode/client/package-lock.json +544 -544
- package/vscode/client/package.json +22 -22
- package/vscode/client/src/extension.ts +104 -104
- package/vscode/icons/firefly-icon.svg +10 -10
- package/vscode/language-configuration.json +61 -61
- package/vscode/package-lock.json +3623 -3623
- package/vscode/package.json +1 -1
- package/vscode/snippets.json +241 -241
- package/vscode/syntaxes/firefly-markdown-injection.json +45 -45
- package/webserver/.firefly/include/package.json +5 -5
- package/webserver/.firefly/package.ff +2 -2
- package/webserver/WebServer.ff +647 -647
- package/websocket/.firefly/package.ff +1 -1
- package/websocket/WebSocket.ff +100 -100
package/core/Task.ff
CHANGED
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
capability Task(
|
|
2
|
-
mutable controller: JsValue
|
|
3
|
-
subtasks: JsValue
|
|
4
|
-
mutable promise: JsValue
|
|
5
|
-
started: Duration
|
|
6
|
-
)
|
|
7
|
-
|
|
8
|
-
extend self: Task {
|
|
9
|
-
|
|
10
|
-
// Spawns a task running body. The return value as well as the argument to body is the task handle.
|
|
11
|
-
// Automatically aborts and then joins subtasks when body returns or throws an unhandled exception.
|
|
12
|
-
// If body throws, the parent task is also aborted with the dueToSubtask flag set to true.
|
|
13
|
-
spawn(body: Task => Unit): Task {
|
|
14
|
-
self.throwIfAborted()
|
|
15
|
-
let task = Task(
|
|
16
|
-
controller = Js->AbortController->()
|
|
17
|
-
subtasks = Js->Set->()
|
|
18
|
-
promise = Js.undefined()
|
|
19
|
-
started = Duration(Js->performance->now()? * 0.001)
|
|
20
|
-
)
|
|
21
|
-
self.subtasks->add(task!)
|
|
22
|
-
task.promise = Js->Promise->resolve(task!)->then(Js.async0 {
|
|
23
|
-
try {
|
|
24
|
-
Js.await(body!.callValue2(task!, task!))
|
|
25
|
-
} tryCatchAny {e =>
|
|
26
|
-
Js.await(self.controller->abort())
|
|
27
|
-
e.rethrow()
|
|
28
|
-
} finally {
|
|
29
|
-
task.subtasks.each {subtask =>
|
|
30
|
-
Js.fromValue[Task](subtask).controller->abort()
|
|
31
|
-
}
|
|
32
|
-
Js.await(Js->Promise->allSettled(
|
|
33
|
-
task.subtasks.spreadToArray().map {subtask =>
|
|
34
|
-
Js.fromValue[Task](subtask).promise
|
|
35
|
-
}
|
|
36
|
-
))
|
|
37
|
-
self.subtasks->delete(task!)
|
|
38
|
-
}
|
|
39
|
-
})
|
|
40
|
-
task
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// If the aborted flag is set for the current task, clears it and throws TaskAbortedException.
|
|
44
|
-
// You don't normally need to call this, but you might want to before doing an expensive computation.
|
|
45
|
-
throwIfAborted(): Unit {
|
|
46
|
-
let signal = self.controller->signal
|
|
47
|
-
if(signal->aborted?) {
|
|
48
|
-
self.controller = Js->AbortController->()
|
|
49
|
-
signal->throwIfAborted()
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Sets the tasks aborted flag, which causes the ongoing/next async call to throw TaskAbortedException.
|
|
54
|
-
abort(): Unit {
|
|
55
|
-
self.controller->abort()
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Create a blocking channel with the specified capacity. The channel is not tied to the task.
|
|
59
|
-
channel[T](capacity: Int = 0): Channel[T] {
|
|
60
|
-
Channel(
|
|
61
|
-
capacity = capacity
|
|
62
|
-
buffer = Array.new()
|
|
63
|
-
readers = Js->Set->()
|
|
64
|
-
writers = Js->Set->()
|
|
65
|
-
)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Create a mutex. The mutex is not tied to the task.
|
|
69
|
-
lock(): Lock {
|
|
70
|
-
Lock(
|
|
71
|
-
owner = Js.undefined()
|
|
72
|
-
level = 0
|
|
73
|
-
queue = Queue.new()
|
|
74
|
-
)
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
now(): Instant {
|
|
78
|
-
Instant(Duration(Js->Date->now()? * 0.001))
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
elapsed(): Duration {
|
|
82
|
-
let now = Js->performance->now()? * 0.001
|
|
83
|
-
Duration(now - self.started.seconds)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
time[R](body: () => R): Pair[R, Duration] {
|
|
87
|
-
let start = self.elapsed()
|
|
88
|
-
let result = body()
|
|
89
|
-
let stop = self.elapsed()
|
|
90
|
-
let duration = Duration(stop.seconds - start.seconds)
|
|
91
|
-
Pair(result, duration)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Convenience methods
|
|
97
|
-
extend self: Task {
|
|
98
|
-
|
|
99
|
-
sleep(duration: Duration): Unit {
|
|
100
|
-
Channel.
|
|
101
|
-
readOr(self.channel()) {_ => }.
|
|
102
|
-
timeout(duration) {}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
mapList[T, R](list: List[T], body: T => R): List[R] {
|
|
106
|
-
self.all(list.map {x => {body(x)}})
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
raceList[T, R](list: List[T], body: T => R): R {
|
|
110
|
-
self.race(list.map {x => {body(x)}})
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
all[T](tasks: List[() => T]): List[T] {
|
|
114
|
-
let successChannel = self.channel()
|
|
115
|
-
let failureChannel = self.channel()
|
|
116
|
-
self.spawn {t =>
|
|
117
|
-
let channel = t.channel()
|
|
118
|
-
try {
|
|
119
|
-
tasks.pairs().each {| Pair(i, task) =>
|
|
120
|
-
t.spawn {_ =>
|
|
121
|
-
channel.write(Pair(i, task()))
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
let result = tasks.map {_ =>
|
|
125
|
-
channel.read()
|
|
126
|
-
}.sortBy {_.first}.map {_.second}
|
|
127
|
-
successChannel.write(result)
|
|
128
|
-
} catchAny {error =>
|
|
129
|
-
failureChannel.write(error)
|
|
130
|
-
t.abort()
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
Channel.
|
|
134
|
-
readOr(successChannel, {_}).
|
|
135
|
-
readOr(failureChannel, {_.rethrow()}).
|
|
136
|
-
wait()
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
race[T](tasks: List[() => T]): T {
|
|
140
|
-
let successChannel = self.channel()
|
|
141
|
-
let failureChannel = self.channel()
|
|
142
|
-
mutable live = tasks.size()
|
|
143
|
-
let started = tasks.map {task =>
|
|
144
|
-
self.spawn {_ =>
|
|
145
|
-
try {
|
|
146
|
-
successChannel.write(task())
|
|
147
|
-
} catchAny {e =>
|
|
148
|
-
live -= 1 // Not thread safe (but OK in JS)
|
|
149
|
-
if(live == 0) {
|
|
150
|
-
failureChannel.write(e)
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
try {
|
|
156
|
-
Channel.
|
|
157
|
-
readOr(successChannel, {_}).
|
|
158
|
-
readOr(failureChannel, {_.rethrow()}).
|
|
159
|
-
wait()
|
|
160
|
-
} finally {
|
|
161
|
-
started.each {_.abort()}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
}
|
|
1
|
+
capability Task(
|
|
2
|
+
mutable controller: JsValue
|
|
3
|
+
subtasks: JsValue
|
|
4
|
+
mutable promise: JsValue
|
|
5
|
+
started: Duration
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
extend self: Task {
|
|
9
|
+
|
|
10
|
+
// Spawns a task running body. The return value as well as the argument to body is the task handle.
|
|
11
|
+
// Automatically aborts and then joins subtasks when body returns or throws an unhandled exception.
|
|
12
|
+
// If body throws, the parent task is also aborted with the dueToSubtask flag set to true.
|
|
13
|
+
spawn(body: Task => Unit): Task {
|
|
14
|
+
self.throwIfAborted()
|
|
15
|
+
let task = Task(
|
|
16
|
+
controller = Js->AbortController->()
|
|
17
|
+
subtasks = Js->Set->()
|
|
18
|
+
promise = Js.undefined()
|
|
19
|
+
started = Duration(Js->performance->now()? * 0.001)
|
|
20
|
+
)
|
|
21
|
+
self.subtasks->add(task!)
|
|
22
|
+
task.promise = Js->Promise->resolve(task!)->then(Js.async0 {
|
|
23
|
+
try {
|
|
24
|
+
Js.await(body!.callValue2(task!, task!))
|
|
25
|
+
} tryCatchAny {e =>
|
|
26
|
+
Js.await(self.controller->abort())
|
|
27
|
+
e.rethrow()
|
|
28
|
+
} finally {
|
|
29
|
+
task.subtasks.each {subtask =>
|
|
30
|
+
Js.fromValue[Task](subtask).controller->abort()
|
|
31
|
+
}
|
|
32
|
+
Js.await(Js->Promise->allSettled(
|
|
33
|
+
task.subtasks.spreadToArray().map {subtask =>
|
|
34
|
+
Js.fromValue[Task](subtask).promise
|
|
35
|
+
}
|
|
36
|
+
))
|
|
37
|
+
self.subtasks->delete(task!)
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
task
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// If the aborted flag is set for the current task, clears it and throws TaskAbortedException.
|
|
44
|
+
// You don't normally need to call this, but you might want to before doing an expensive computation.
|
|
45
|
+
throwIfAborted(): Unit {
|
|
46
|
+
let signal = self.controller->signal
|
|
47
|
+
if(signal->aborted?) {
|
|
48
|
+
self.controller = Js->AbortController->()
|
|
49
|
+
signal->throwIfAborted()
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Sets the tasks aborted flag, which causes the ongoing/next async call to throw TaskAbortedException.
|
|
54
|
+
abort(): Unit {
|
|
55
|
+
self.controller->abort()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Create a blocking channel with the specified capacity. The channel is not tied to the task.
|
|
59
|
+
channel[T](capacity: Int = 0): Channel[T] {
|
|
60
|
+
Channel(
|
|
61
|
+
capacity = capacity
|
|
62
|
+
buffer = Array.new()
|
|
63
|
+
readers = Js->Set->()
|
|
64
|
+
writers = Js->Set->()
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Create a mutex. The mutex is not tied to the task.
|
|
69
|
+
lock(): Lock {
|
|
70
|
+
Lock(
|
|
71
|
+
owner = Js.undefined()
|
|
72
|
+
level = 0
|
|
73
|
+
queue = Queue.new()
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
now(): Instant {
|
|
78
|
+
Instant(Duration(Js->Date->now()? * 0.001))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
elapsed(): Duration {
|
|
82
|
+
let now = Js->performance->now()? * 0.001
|
|
83
|
+
Duration(now - self.started.seconds)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
time[R](body: () => R): Pair[R, Duration] {
|
|
87
|
+
let start = self.elapsed()
|
|
88
|
+
let result = body()
|
|
89
|
+
let stop = self.elapsed()
|
|
90
|
+
let duration = Duration(stop.seconds - start.seconds)
|
|
91
|
+
Pair(result, duration)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Convenience methods
|
|
97
|
+
extend self: Task {
|
|
98
|
+
|
|
99
|
+
sleep(duration: Duration): Unit {
|
|
100
|
+
Channel.
|
|
101
|
+
readOr(self.channel()) {_ => }.
|
|
102
|
+
timeout(duration) {}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
mapList[T, R](list: List[T], body: T => R): List[R] {
|
|
106
|
+
self.all(list.map {x => {body(x)}})
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
raceList[T, R](list: List[T], body: T => R): R {
|
|
110
|
+
self.race(list.map {x => {body(x)}})
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
all[T](tasks: List[() => T]): List[T] {
|
|
114
|
+
let successChannel = self.channel()
|
|
115
|
+
let failureChannel = self.channel()
|
|
116
|
+
self.spawn {t =>
|
|
117
|
+
let channel = t.channel()
|
|
118
|
+
try {
|
|
119
|
+
tasks.pairs().each {| Pair(i, task) =>
|
|
120
|
+
t.spawn {_ =>
|
|
121
|
+
channel.write(Pair(i, task()))
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
let result = tasks.map {_ =>
|
|
125
|
+
channel.read()
|
|
126
|
+
}.sortBy {_.first}.map {_.second}
|
|
127
|
+
successChannel.write(result)
|
|
128
|
+
} catchAny {error =>
|
|
129
|
+
failureChannel.write(error)
|
|
130
|
+
t.abort()
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
Channel.
|
|
134
|
+
readOr(successChannel, {_}).
|
|
135
|
+
readOr(failureChannel, {_.rethrow()}).
|
|
136
|
+
wait()
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
race[T](tasks: List[() => T]): T {
|
|
140
|
+
let successChannel = self.channel()
|
|
141
|
+
let failureChannel = self.channel()
|
|
142
|
+
mutable live = tasks.size()
|
|
143
|
+
let started = tasks.map {task =>
|
|
144
|
+
self.spawn {_ =>
|
|
145
|
+
try {
|
|
146
|
+
successChannel.write(task())
|
|
147
|
+
} catchAny {e =>
|
|
148
|
+
live -= 1 // Not thread safe (but OK in JS)
|
|
149
|
+
if(live == 0) {
|
|
150
|
+
failureChannel.write(e)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
Channel.
|
|
157
|
+
readOr(successChannel, {_}).
|
|
158
|
+
readOr(failureChannel, {_.rethrow()}).
|
|
159
|
+
wait()
|
|
160
|
+
} finally {
|
|
161
|
+
started.each {_.abort()}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
/*
|
|
2
|
-
nodeMain(system: NodeSystem) {
|
|
3
|
-
benchmark()
|
|
4
|
-
let time = system.mainTask().time {
|
|
5
|
-
benchmark()
|
|
6
|
-
}
|
|
7
|
-
Log.trace(time.second.show())
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
benchmark() {
|
|
11
|
-
mutable num = 20000
|
|
12
|
-
let v = num
|
|
13
|
-
mutable i = 1
|
|
14
|
-
mutable j = 1
|
|
15
|
-
mutable sum = 0
|
|
16
|
-
while {i < v} {
|
|
17
|
-
j = 1
|
|
18
|
-
while {j < num - 1} {
|
|
19
|
-
if(num % j == 0) {
|
|
20
|
-
sum += j
|
|
21
|
-
}
|
|
22
|
-
j += 1
|
|
23
|
-
}
|
|
24
|
-
if(num == sum) {
|
|
25
|
-
Log.show(sum)
|
|
26
|
-
}
|
|
27
|
-
sum = 0
|
|
28
|
-
num -= 1
|
|
29
|
-
i += 1
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
// Rewrite this in Java
|
|
35
|
-
|
|
36
|
-
public class Pyrotek45 {
|
|
37
|
-
public static void main(String[] args) {
|
|
38
|
-
benchmark();
|
|
39
|
-
long time = System.currentTimeMillis();
|
|
40
|
-
benchmark();
|
|
41
|
-
time = System.currentTimeMillis() - time;
|
|
42
|
-
System.out.println(time / 1000.0);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
public static void benchmark() {
|
|
46
|
-
int num = 20000;
|
|
47
|
-
int v = num;
|
|
48
|
-
int i = 1;
|
|
49
|
-
int j = 1;
|
|
50
|
-
int sum = 0;
|
|
51
|
-
for (i = 1; i < v; i++) {
|
|
52
|
-
for (j = 1; j < num - 1; j++) {
|
|
53
|
-
if (num % j == 0) {
|
|
54
|
-
sum += j;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (num == sum) {
|
|
58
|
-
System.out.println(sum);
|
|
59
|
-
}
|
|
60
|
-
sum = 0;
|
|
61
|
-
num -= 1;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
nodeMain(system: NodeSystem) {
|
|
3
|
+
benchmark()
|
|
4
|
+
let time = system.mainTask().time {
|
|
5
|
+
benchmark()
|
|
6
|
+
}
|
|
7
|
+
Log.trace(time.second.show())
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
benchmark() {
|
|
11
|
+
mutable num = 20000
|
|
12
|
+
let v = num
|
|
13
|
+
mutable i = 1
|
|
14
|
+
mutable j = 1
|
|
15
|
+
mutable sum = 0
|
|
16
|
+
while {i < v} {
|
|
17
|
+
j = 1
|
|
18
|
+
while {j < num - 1} {
|
|
19
|
+
if(num % j == 0) {
|
|
20
|
+
sum += j
|
|
21
|
+
}
|
|
22
|
+
j += 1
|
|
23
|
+
}
|
|
24
|
+
if(num == sum) {
|
|
25
|
+
Log.show(sum)
|
|
26
|
+
}
|
|
27
|
+
sum = 0
|
|
28
|
+
num -= 1
|
|
29
|
+
i += 1
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
// Rewrite this in Java
|
|
35
|
+
|
|
36
|
+
public class Pyrotek45 {
|
|
37
|
+
public static void main(String[] args) {
|
|
38
|
+
benchmark();
|
|
39
|
+
long time = System.currentTimeMillis();
|
|
40
|
+
benchmark();
|
|
41
|
+
time = System.currentTimeMillis() - time;
|
|
42
|
+
System.out.println(time / 1000.0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public static void benchmark() {
|
|
46
|
+
int num = 20000;
|
|
47
|
+
int v = num;
|
|
48
|
+
int i = 1;
|
|
49
|
+
int j = 1;
|
|
50
|
+
int sum = 0;
|
|
51
|
+
for (i = 1; i < v; i++) {
|
|
52
|
+
for (j = 1; j < num - 1; j++) {
|
|
53
|
+
if (num % j == 0) {
|
|
54
|
+
sum += j;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (num == sum) {
|
|
58
|
+
System.out.println(sum);
|
|
59
|
+
}
|
|
60
|
+
sum = 0;
|
|
61
|
+
num -= 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|