From a4d8045349e12e99054f0508257d4277537850b6 Mon Sep 17 00:00:00 2001 From: Misha Wakerman Date: Tue, 30 Apr 2019 23:31:12 +1000 Subject: [PATCH] fix: do not modify iter during List.map and Map.map (#1649) --- __tests__/List.ts | 8 ++++++++ __tests__/Map.ts | 6 ++++++ src/List.js | 2 +- src/Map.js | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/__tests__/List.ts b/__tests__/List.ts index a3b2dd0fc4..b0b7eba734 100644 --- a/__tests__/List.ts +++ b/__tests__/List.ts @@ -519,6 +519,14 @@ describe('List', () => { expect(r).toBe(v); }); + it('ensures iter is unmodified', () => { + const v = List.of(1, 2, 3); + const r = v.map((value, index, iter) => { + return iter.get(index - 1); + }); + expect(r.toArray()).toEqual([3, 1, 2]); + }); + it('filters values', () => { const v = List.of('a', 'b', 'c', 'd', 'e', 'f'); const r = v.filter((value, index) => index % 2 === 1); diff --git a/__tests__/Map.ts b/__tests__/Map.ts index 3920af4aae..3553b432d5 100644 --- a/__tests__/Map.ts +++ b/__tests__/Map.ts @@ -261,6 +261,12 @@ describe('Map', () => { expect(r).toBe(m); }); + it('ensures iter is unmodified', () => { + const m = Map({ a: 1, b: 1 }); + const r = m.map((value, key, iter) => 2 * iter.get(key)); + expect(r.toObject()).toEqual({ a: 2, b: 2 }); + }); + it('filters values', () => { const m = Map({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }); const r = m.filter(value => value % 2 === 1); diff --git a/src/List.js b/src/List.js index a20f41fd5b..59126412fd 100644 --- a/src/List.js +++ b/src/List.js @@ -176,7 +176,7 @@ export class List extends IndexedCollection { map(mapper, context) { return this.withMutations(list => { for (let i = 0; i < this.size; i++) { - list.set(i, mapper.call(context, list.get(i), i, list)); + list.set(i, mapper.call(context, list.get(i), i, this)); } }); } diff --git a/src/Map.js b/src/Map.js index 9ff3f6db26..3b3f4ac00e 100644 --- a/src/Map.js +++ b/src/Map.js @@ -128,7 +128,7 @@ export class Map extends KeyedCollection { map(mapper, context) { return this.withMutations(map => { map.forEach((value, key) => { - map.set(key, mapper.call(context, value, key, map)); + map.set(key, mapper.call(context, value, key, this)); }); }); }