Skip to content

Commit b4af917

Browse files
🚴 perf: Better lazy eval, avoid trashing GC with empty trees.
1 parent c19b59b commit b4af917

40 files changed

+379
-253
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,11 @@
220220
],
221221
"rules": {
222222
"camelcase": "off",
223+
"no-bitwise": "off",
223224
"unicorn/filename-case": "off",
224225
"unicorn/explicit-length-check": "off",
225226
"unicorn/no-array-push-push": "off",
227+
"unicorn/prefer-math-trunc": "off",
226228
"unicorn/prefer-node-protocol": "off",
227229
"unicorn/prefer-module": "off"
228230
},

src/0-core/_fast/_deepL.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/0-core/_fast/_deepR.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/0-core/_fast/_fill_right.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {node3} from '../../2-node/node3.js';
88
import {Empty} from '../../3-tree/implementations/0-Empty.js';
99
import {Single} from '../../3-tree/implementations/1-Single.js';
1010
import {Deep} from '../../3-tree/implementations/2-Deep.js';
11-
import {Lazy} from '../../4-lazy/0-Lazy.js';
11+
import Lazy from '../../4-lazy/Lazy.js';
1212

1313
/**
1414
* _fill_right.

src/0-core/_fast/_from_by_filling.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {One} from '../../1-digit/1-One.js';
2-
import {Empty} from '../../3-tree/implementations/0-Empty.js';
2+
import empty from '../../5-api/empty.js';
33
import {Single} from '../../3-tree/implementations/1-Single.js';
44
import {cache} from '../measure/cache.js';
55
import _fill_right from './_fill_right.js';
@@ -8,15 +8,15 @@ export default function _form_by_filling(M, iterable) {
88
const it = iterable[Symbol.iterator]();
99

1010
let event = it.next();
11-
if (event.done) return new Empty(M);
11+
if (event.done) return empty(M);
1212
const a = event.value;
1313

1414
event = it.next();
1515
if (event.done) return new Single(M, a);
1616
const b = event.value;
1717

1818
const left = new One(a);
19-
const middle = new Empty(cache(M));
19+
const middle = empty(cache(M));
2020

2121
return _fill_right(M, left, middle, b, it);
2222
}

src/0-core/_fast/_from_medium_list.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import assert from 'assert';
2-
import {Empty, Single, Deep} from '../../3-tree/index.js';
2+
import {Single, Deep} from '../../3-tree/index.js';
3+
import empty from '../../5-api/empty.js';
34
import {Two, One} from '../../1-digit/index.js';
45
import {cache} from '../measure/index.js';
56

@@ -11,24 +12,19 @@ export function _from_medium_list(M, list) {
1112
case 1:
1213
return new Single(M, list[0]);
1314
case 2:
14-
return new Deep(
15-
M,
16-
new One(list[0]),
17-
new Empty(cache(M)),
18-
new One(list[1]),
19-
);
15+
return new Deep(M, new One(list[0]), empty(cache(M)), new One(list[1]));
2016
case 3:
2117
return new Deep(
2218
M,
2319
new Two(list[0], list[1]),
24-
new Empty(cache(M)),
20+
empty(cache(M)),
2521
new One(list[2]),
2622
);
2723
case 4:
2824
return new Deep(
2925
M,
3026
new Two(list[0], list[1]),
31-
new Empty(cache(M)),
27+
empty(cache(M)),
3228
new Two(list[2], list[3]),
3329
);
3430
}

src/0-core/_fast/index.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/0-core/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
export * from './_fast/index.js';
21
export * from './concatenate/index.js';
32
export * from './measure/index.js';
43
export * from './split/index.js';

src/0-core/split/deepL.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import assert from 'assert';
22

33
import {Digit} from '../../1-digit/0-Digit.js';
44
import {Deep, Tree} from '../../3-tree/index.js';
5-
import {delay} from '../../4-lazy/index.js';
5+
import delayTail from '../../4-lazy/delayTail.js';
66

77
/**
88
* @param {any} M
@@ -18,12 +18,7 @@ export function deepL(M, left, middle, right) {
1818
if (left === null) {
1919
if (middle.isEmpty()) return right._tree(M);
2020

21-
return new Deep(
22-
M,
23-
middle.head()._digit(),
24-
delay(() => middle.tail()),
25-
right,
26-
);
21+
return new Deep(M, middle.head()._digit(), delayTail(middle), right);
2722
}
2823

2924
return new Deep(M, left, middle, right);

src/0-core/split/deepR.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import assert from 'assert';
22

33
import {Digit} from '../../1-digit/0-Digit.js';
44
import {Deep, Tree} from '../../3-tree/index.js';
5-
import {delay} from '../../4-lazy/index.js';
5+
import delayInit from '../../4-lazy/delayInit.js';
66

77
/**
88
* @param {any} M
@@ -18,12 +18,7 @@ export function deepR(M, left, middle, right) {
1818
if (right === null) {
1919
if (middle.isEmpty()) return left._tree(M);
2020

21-
return new Deep(
22-
M,
23-
left,
24-
delay(() => middle.init()),
25-
middle.last()._digit(),
26-
);
21+
return new Deep(M, left, delayInit(middle), middle.last()._digit());
2722
}
2823

2924
return new Deep(M, left, middle, right);

0 commit comments

Comments
 (0)