diff --git a/CHANGELOG.md b/CHANGELOG.md index 5abbf49e28..b37099b3b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ Dates are formatted as YYYY-MM-DD. ## Unreleased +## [4.3.7] - 2024-07-22 + +- Fix issue with slice negative of filtered sequence [#2006](https://github.com/immutable-js/immutable-js/pull/2006) by [@jdeniau](https://github.com/jdeniau) + ## [4.3.6] - 2024-05-13 - Fix `Repeat().equals(undefined)` incorrectly returning true [#1994](https://github.com/immutable-js/immutable-js/pull/1994) by [@butchler](https://github.com/butchler) diff --git a/__tests__/Range.ts b/__tests__/Range.ts index 0a5618ff46..f55c860cb8 100644 --- a/__tests__/Range.ts +++ b/__tests__/Range.ts @@ -190,4 +190,15 @@ describe('Range', () => { expect(r).toEqual(200); }); + + it('sliced sequence works even on filtered sequence', () => { + expect(Range(0, 3).slice(-2).toArray()).toEqual([1, 2]); + + expect( + Range(0, 3) + .filter($ => true) + .slice(-2) + .toArray() + ).toEqual([1, 2]); + }); }); diff --git a/package-lock.json b/package-lock.json index c2aa92ddf1..ad466f70b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "immutable", - "version": "4.3.6", + "version": "4.3.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "immutable", - "version": "4.3.6", + "version": "4.3.7", "license": "MIT", "devDependencies": { "@types/jest": "27.0.1", diff --git a/package.json b/package.json index 6a3ff3831c..afcea4d861 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immutable", - "version": "4.3.6", + "version": "4.3.7", "description": "Immutable Data Collections", "license": "MIT", "homepage": "https://immutable-js.com", diff --git a/src/Operations.js b/src/Operations.js index 888f22c61f..f50857a064 100644 --- a/src/Operations.js +++ b/src/Operations.js @@ -408,16 +408,16 @@ export function sliceFactory(collection, begin, end, useKeys) { return collection; } - const resolvedBegin = resolveBegin(begin, originalSize); - const resolvedEnd = resolveEnd(end, originalSize); - - // begin or end will be NaN if they were provided as negative numbers and + // begin or end can not be resolved if they were provided as negative numbers and // this collection's size is unknown. In that case, cache first so there is // a known size and these do not resolve to NaN. - if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) { + if (typeof originalSize === 'undefined' && (begin < 0 || end < 0)) { return sliceFactory(collection.toSeq().cacheResult(), begin, end, useKeys); } + const resolvedBegin = resolveBegin(begin, originalSize); + const resolvedEnd = resolveEnd(end, originalSize); + // Note: resolvedEnd is undefined when the original sequence's length is // unknown and this slice did not supply an end and should contain all // elements after resolvedBegin.