-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathlazy-foldr.suite.js
More file actions
62 lines (55 loc) · 1.23 KB
/
Copy pathlazy-foldr.suite.js
File metadata and controls
62 lines (55 loc) · 1.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
const Suite = require("./default-suite").Suite;
function thunkFn(init, idx, f, list) {
return () => {
if (idx === list.length) {
return init;
} else {
return f(list[idx], thunkFn(init, idx + 1, f, list));
}
};
}
function lazyFoldrLambda(f, init, list) {
if (list.length === 0) {
return init;
} else {
return f(list[0], thunkFn(init, 1, f, list));
}
}
class Thunk {
constructor(init, idx, f, list) {
this.init = init;
this.idx = idx;
this.f = f;
this.list = list;
}
force() {
if (this.idx === this.list.length) {
return this.init;
} else {
return this.f(
this.list[this.idx],
new Thunk(this.init, this.idx + 1, this.f, this.list)
);
}
}
}
function lazyFoldrObj(f, init, list) {
if (list.length === 0) {
return init;
} else {
return f(list[0], new Thunk(init, 1, f, list));
}
}
var array = [];
for (var i = 0; i < 1000; i++) {
array[i] = i;
}
lazyFoldrLambda((n, m) => n + m(), 0, array);
module.exports = Suite("Lazy foldr")
.add("function", () => {
return lazyFoldrLambda((n, m) => n + m(), 0, array);
})
.add("object", () => {
return lazyFoldrObj((n, m) => n + m.force(), 0, array);
})
.run({async: true});