10000 Fix a few cases where get/has/last are incorrect. filterSeq should on… · designtestcode/immutable-js@9e63cc0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9e63cc0

Browse files
committed
Fix a few cases where get/has/last are incorrect. filterSeq should only specialize get/has when using keys. reverseSeq should have a similar has() method. last() should take advantage of negative indexing.
1 parent 8968dd2 commit 9e63cc0

File tree

4 files changed

+102
-42
lines changed

4 files changed

+102
-42
lines changed

__tests__/get.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
///<reference path='../resources/jest.d.ts'/>
2+
///<reference path='../dist/Immutable.d.ts'/>
3+
4+
jest.autoMockOff();
5+
6+
import I = require('immutable');
7+
8+
describe('get', () => {
9+
10+
it('gets any index', () => {
11+
var seq = I.Range(0, 100);
12+
expect(seq.get(20)).toBe(20);
13+
});
14+
15+
it('gets first', () => {
16+
var seq = I.Range(0, 100);
17+
expect(seq.first()).toBe(0);
18+
});
19+
20+
it('gets last', () => {
21+
var seq = I.Range(0, 100);
22+
expect(seq.last()).toBe(99);
23+
});
24+
25+
it('gets any index after reversing', () => {
26+
var seq = I.Range(0, 100).reverse();
27+
expect(seq.get(20)).toBe(79);
28+
});
29+
30+
it('gets first after reversing', () => {
31+
var seq = I.Range(0, 100).reverse();
32+
expect(seq.first()).toBe(99);
33+
});
34+
35+
it('gets last after reversing', () => {
36+
var seq = I.Range(0, 100).reverse();
37+
expect(seq.last()).toBe(0);
38+
});
39+
40+
it('gets any index when length is unknown', () => {
41+
var seq = I.Range(0, 100).filter(x => x % 2 === 1);
42+
expect(seq.get(20)).toBe(41);
43+
});
44+
45+
it('gets first when length is unknown', () => {
46+
var seq = I.Range(0, 100).filter(x => x % 2 === 1);
47+
expect(seq.first()).toBe(1);
48+
});
49+
50+
it('gets last when length is unknown', () => {
51+
var seq = I.Range(0, 100).filter(x => x % 2 === 1);
52+
expect(seq.last()).toBe(99); // Note: this is O(N)
53+
});
54+
55+
});

dist/Immutable.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ var $Sequence = Sequence;
519519
return this.flip().valueSeq();
520520
},
521521
last: function() {
522-
return this.findLast(returnTrue);
522+
return this.reverse().first();
523523
},
524524
mapEntries: function(mapper, context) {
525525
var $__0 = this;
@@ -697,7 +697,7 @@ var $IndexedSequence = IndexedSequence;
697697
return interposeFactory(this, separator);
698698
},
699699
last: function() {
700-
return this.get(this.length ? this.length - 1 : 0);
700+
return this.get(-1);
701701
},
702702
skip: function(amount) {
703703
var seq = this;
@@ -1190,7 +1190,7 @@ function reverseFactory(sequence, useKeys) {
11901190
return sequence.get(useKeys ? key : -1 - key, notSetValue);
11911191
});
11921192
reversedSequence.has = (function(key) {
1193-
return sequence.has(key);
1193+
return sequence.has(useKeys ? key : -1 - key);
11941194
});
11951195
reversedSequence.contains = (function(value) {
11961196
return sequence.contains(value);
@@ -1213,14 +1213,16 @@ function reverseFactory(sequence, useKeys) {
12131213
}
12141214
function filterFactory(sequence, predicate, context, useKeys) {
12151215
var filterSequence = sequence.__makeSequence();
1216-
filterSequence.has = (function(key) {
1217-
var v = sequence.get(key, NOT_SET);
1218-
return v !== NOT_SET && !!predicate.call(context, v, key, sequence);
1219-
});
1220-
filterSequence.get = (function(key, notSetValue) {
1221-
var v = sequence.get(key, NOT_SET);
1222-
return v !== NOT_SET && predicate.call(context, v, key, sequence) ? v : notSetValue;
1223-
});
1216+
if (useKeys) {
1217+
filterSequence.has = (function(key) {
1218+
var v = sequence.get(key, NOT_SET);
1219+
return v !== NOT_SET && !!predicate.call(context, v, key, sequence);
1220+
});
1221+
filterSequence.get = (function(key, notSetValue) {
1222+
var v = sequence.get(key, NOT_SET);
1223+
return v !== NOT_SET && predicate.call(context, v, key, sequence) ? v : notSetValue;
1224+
});
1225+
}
12241226
filterSequence.__iterateUncached = function(fn, reverse) {
12251227
var $__0 = this;
12261228
var iterations = 0;

0 commit comments

Comments
 (0)
0