From: Jérôme Benoit Date: Sat, 29 Jul 2023 13:20:57 +0000 (+0200) Subject: fix: fix circular array splice semantic X-Git-Tag: v2.6.21~11 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=4077981dc9caec2cfac65c996ead75471321386c;p=poolifier.git fix: fix circular array splice semantic Signed-off-by: Jérôme Benoit --- diff --git a/src/circular-array.ts b/src/circular-array.ts index 40bd19ae..dadfa950 100644 --- a/src/circular-array.ts +++ b/src/circular-array.ts @@ -51,18 +51,28 @@ export class CircularArray extends Array { } /** @inheritDoc */ - public splice (start: number, deleteCount?: number, ...items: T[]): T[] { - let itemsRemoved: T[] + public splice ( + start: number, + deleteCount?: number, + ...items: T[] + ): CircularArray { + let itemsRemoved: T[] = [] if (arguments.length >= 3 && deleteCount !== undefined) { - itemsRemoved = super.splice(start, deleteCount) - // FIXME: that makes the items insert not in place - this.push(...items) + itemsRemoved = super.splice(start, deleteCount, ...items) + if (this.length > this.size) { + const itemsOverflowing = super.splice(0, this.length - this.size) + itemsRemoved = new CircularArray( + itemsRemoved.length + itemsOverflowing.length, + ...itemsRemoved, + ...itemsOverflowing + ) + } } else if (arguments.length === 2) { itemsRemoved = super.splice(start, deleteCount) } else { itemsRemoved = super.splice(start) } - return itemsRemoved + return itemsRemoved as CircularArray } public resize (size: number): void { diff --git a/tests/circular-array.test.js b/tests/circular-array.test.js index a8637234..7e3e96cb 100644 --- a/tests/circular-array.test.js +++ b/tests/circular-array.test.js @@ -83,9 +83,9 @@ describe('Circular array test suite', () => { expect(circularArray).toStrictEqual(new CircularArray(1000, 1, 2, 4, 5)) circularArray = new CircularArray(4, 1, 2, 3, 4) deletedItems = circularArray.splice(2, 1, 5, 6) - expect(deletedItems).toStrictEqual(new CircularArray(1, 3)) + expect(deletedItems).toStrictEqual(new CircularArray(2, 3, 1)) expect(circularArray.length).toBe(4) - expect(circularArray).toStrictEqual(new CircularArray(4, 2, 4, 5, 6)) + expect(circularArray).toStrictEqual(new CircularArray(4, 2, 5, 6, 4)) }) it('Verify that circular array concat works as intended', () => {