From 3f5ec0be28d58a0e849b233d3060e9d50d97c1e4 Mon Sep 17 00:00:00 2001 From: Joachim Viide Date: Sun, 7 Jul 2024 01:32:39 +0000 Subject: [PATCH] fix(range): compute formatted value lazily This speeds bench-subset and bench-satisfies by up to 9%. The external interface of the Range class is kept as-is except that the .range property is not writable anymore. format test --- classes/range.js | 32 +++++++++++++++++++------------- test/classes/range.js | 9 +++++++++ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/classes/range.js b/classes/range.js index 3f61ecad..ceee2314 100644 --- a/classes/range.js +++ b/classes/range.js @@ -20,7 +20,7 @@ class Range { // just put it in the set and return this.raw = range.value this.set = [[range]] - this.format() + this.formatted = undefined return this } @@ -65,23 +65,29 @@ class Range { } } - this.format() + this.formatted = undefined } - format () { - this.range = '' - for (let i = 0; i < this.set.length; i++) { - if (i > 0) { - this.range += '||' - } - const comps = this.set[i] - for (let k = 0; k < comps.length; k++) { - if (k > 0) { - this.range += ' ' + get range () { + if (this.formatted === undefined) { + this.formatted = '' + for (let i = 0; i < this.set.length; i++) { + if (i > 0) { + this.formatted += '||' + } + const comps = this.set[i] + for (let k = 0; k < comps.length; k++) { + if (k > 0) { + this.formatted += ' ' + } + this.formatted += comps[k].toString().trim() } - this.range += comps[k].toString().trim() } } + return this.formatted + } + + format () { return this.range } diff --git a/test/classes/range.js b/test/classes/range.js index 9547e23a..c1e6eb1b 100644 --- a/test/classes/range.js +++ b/test/classes/range.js @@ -82,6 +82,15 @@ test('tostrings', (t) => { t.end() }) +test('formatted value is calculated lazily and cached', (t) => { + const r = new Range('>= v1.2.3') + t.equal(r.formatted, undefined) + t.equal(r.format(), '>=1.2.3') + t.equal(r.formatted, '>=1.2.3') + t.equal(r.format(), '>=1.2.3') + t.end() +}) + test('ranges intersect', (t) => { rangeIntersection.forEach(([r0, r1, expect]) => { t.test(`${r0} <~> ${r1}`, t => {