Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit e5b442a

Browse filesBrowse files
committed
Better constructor for Vector
1 parent 19f7396 commit e5b442a
Copy full SHA for e5b442a

File tree

Expand file treeCollapse file tree

7 files changed

+84
-40
lines changed
Filter options
Expand file treeCollapse file tree

7 files changed

+84
-40
lines changed

‎__tests__/Vector.ts

Copy file name to clipboardExpand all lines: __tests__/Vector.ts
+16-4Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,20 @@ describe('Vector', () => {
1717
expect(v.toArray()).toEqual(['a', 'b', 'c']);
1818
});
1919

20-
it('fromArray consumes a JS array', () => {
21-
var v = Vector.fromArray(['a', 'b', 'c']);
20+
it('from consumes a JS array', () => {
21+
var v = Vector.from(['a', 'b', 'c']);
22+
expect(v.toArray()).toEqual(['a', 'b', 'c']);
23+
});
24+
25+
it('from consumes a Sequence', () => {
26+
var seq = Immutable.Sequence(['a', 'b', 'c']);
27+
var v = Vector.from(seq);
28+
expect(v.toArray()).toEqual(['a', 'b', 'c']);
29+
});
30+
31+
it('from consumes a non-indexed Sequence', () => {
32+
var seq = Immutable.Sequence({a:null, b:null, c:null}).flip();
33+
var v = Vector.from(seq);
2234
expect(v.toArray()).toEqual(['a', 'b', 'c']);
2335
});
2436

@@ -227,8 +239,8 @@ describe('Vector', () => {
227239
it('ensures equality', () => {
228240
// Make a sufficiently long vector.
229241
var a = Array(100).join('abcdefghijklmnopqrstuvwxyz').split('');
230-
var v1 = Vector.fromArray(a);
231-
var v2 = Vector.fromArray(a);
242+
var v1 = Vector.from(a);
243+
var v2 = Vector.from(a);
232244
expect(v1 == v2).not.toBe(true);
233245
expect(v1 === v2).not.toBe(true);
234246
expect(v1.equals(v2)).toBe(true);

‎dist/Immutable.d.ts

Copy file name to clipboardExpand all lines: dist/Immutable.d.ts
+12-6Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,27 +1122,33 @@ export interface Set<T> extends Sequence<T, T> {
11221122
export declare module Vector {
11231123

11241124
/**
1125-
* Returns an empty Vector.
1125+
* `Vector.empty()` returns a Vector of length 0.
11261126
*/
11271127
function empty<T>(): Vector<T>;
11281128

11291129
/**
1130-
* Returns a Vector of the same length of the provided `values` Array,
1131-
* containing the values at the same indices.
1130+
* `Vector.from()` returns a Vector of the same length of the provided
1131+
* `values` JavaScript Array or Sequence, containing the values at the
1132+
* same indices.
1133+
*
1134+
* If a non-indexed Sequence is provided, its keys will be discarded and
1135+
* its values will be used to fill the returned Vector.
11321136
*/
1133-
function fromArray<T>(values: Array<T>): Vector<T>;
1137+
function from<T>(array: Array<T>): Vector<T>;
1138+
function from<T>(sequence: Sequence<any, T>): Vector<T>;
11341139
}
11351140

11361141
/**
1137-
* Alias for Vector.empty()
1142+
* Alias for `Vector.empty()`
11381143
*/
11391144
export declare function Vector<T>(): Vector<T>;
11401145

11411146
/**
1142-
* Like Vector.forArray(), but accepts variable arugments instead of an Array.
1147+
* Like `Vector.from()`, but accepts variable arguments instead of an Array.
11431148
*/
11441149
export declare function Vector<T>(...values: T[]): Vector<T>;
11451150

1151+
11461152
export interface Vector<T> extends IndexedSequence<T> {
11471153

11481154
/**

‎dist/Sequence.js

Copy file name to clipboardExpand all lines: dist/Sequence.js
+1-5Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ var Immutable = require('./Immutable');
154154
};
155155

156156
Sequence.prototype.keys=function() {"use strict";
157-
return this.map(keyMapper).values();
157+
return this.flip().values();
158158
};
159159

160160
Sequence.prototype.values=function() {"use strict";
@@ -776,10 +776,6 @@ function resolveEnd(end, length) {
776776
return end == null ? length : end < 0 ? Math.max(0, length + end) : length ? Math.min(length, end) : end;
777777
}
778778

779-
function keyMapper(v, k) {
780-
return k;
781-
}
782-
783779
function entryMapper(v, k) {
784780
return [k, v];
785781
}

‎dist/Vector.js

Copy file name to clipboardExpand all lines: dist/Vector.js
+21-7Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
var IndexedSequence = require('./Sequence').IndexedSequence;
1+
var SequenceModule = require('./Sequence');
2+
var Sequence = SequenceModule.Sequence;
3+
var IndexedSequence = SequenceModule.IndexedSequence;
24
var ImmutableMap = require('./Map');
35

46

@@ -7,7 +9,7 @@ for(var IndexedSequence____Key in IndexedSequence){if(IndexedSequence.hasOwnProp
79
// @pragma Construction
810

911
function Vector() {"use strict";var values=Array.prototype.slice.call(arguments,0);
10-
return Vector.fromArray(values);
12+
return Vector.from(values);
1113
}
1214

1315
Vector.empty=function() {"use strict";
@@ -16,14 +18,26 @@ for(var IndexedSequence____Key in IndexedSequence){if(IndexedSequence.hasOwnProp
1618
);
1719
};
1820

19-
Vector.fromArray=function(values) {"use strict";
20-
if (values.length === 0) {
21+
Vector.from=function(sequence) {"use strict";
22+
if (sequence && sequence.constructor === Vector) {
23+
return sequence;
24+
}
25+
if (!sequence || sequence.length === 0) {
2126
return Vector.empty();
2227
}
23-
if (values.length > 0 && values.length < SIZE) {
24-
return Vector.$Vector_make(0, values.length, SHIFT, __EMPTY_VNODE, new VNode(values.slice()));
28+
var isArray = Array.isArray(sequence);
29+
if (sequence.length > 0 && sequence.length < SIZE) {
30+
return Vector.$Vector_make(0, sequence.length, SHIFT, __EMPTY_VNODE, new VNode(
31+
isArray ? sequence.slice() : Sequence(sequence).toArray()
32+
));
33+
}
34+
if (!isArray) {
35+
sequence = Sequence(sequence);
36+
if (!(sequence instanceof IndexedSequence)) {
37+
sequence = sequence.values();
38+
}
2539
}
26-
return Vector.empty().merge(values);
40+
return Vector.empty().merge(sequence);
2741
};
2842

2943
Vector.prototype.toString=function() {"use strict";

‎src/Sequence.js

Copy file name to clipboardExpand all lines: src/Sequence.js
+1-5Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class Sequence {
154154
}
155155

156156
keys() {
157-
return this.map(keyMapper).values();
157+
return this.flip().values();
158158
}
159159

160160
values() {
@@ -776,10 +776,6 @@ function resolveEnd(end, length) {
776776
return end == null ? length : end < 0 ? Math.max(0, length + end) : length ? Math.min(length, end) : end;
777777
}
778778

779-
function keyMapper(v, k) {
780-
return k;
781-
}
782-
783779
function entryMapper(v, k) {
784780
return [k, v];
785781
}

‎src/Vector.js

Copy file name to clipboardExpand all lines: src/Vector.js
+21-7Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
var IndexedSequence = require('./Sequence').IndexedSequence;
1+
var SequenceModule = require('./Sequence');
2+
var Sequence = SequenceModule.Sequence;
3+
var IndexedSequence = SequenceModule.IndexedSequence;
24
var ImmutableMap = require('./Map');
35

46

@@ -7,7 +9,7 @@ class Vector extends IndexedSequence {
79
// @pragma Construction
810

911
constructor(...values) {
10-
return Vector.fromArray(values);
12+
return Vector.from(values);
1113
}
1214

1315
static empty() {
@@ -16,14 +18,26 @@ class Vector extends IndexedSequence {
1618
);
1719
}
1820

19-
static fromArray(values) {
20-
if (values.length === 0) {
21+
static from(sequence) {
22+
if (sequence && sequence.constructor === Vector) {
23+
return sequence;
24+
}
25+
if (!sequence || sequence.length === 0) {
2126
return Vector.empty();
2227
}
23-
if (values.length > 0 && values.length < SIZE) {
24-
return Vector._make(0, values.length, SHIFT, __EMPTY_VNODE, new VNode(values.slice()));
28+
var isArray = Array.isArray(sequence);
29+
if (sequence.length > 0 && sequence.length < SIZE) {
30+
return Vector._make(0, sequence.length, SHIFT, __EMPTY_VNODE, new VNode(
31+
isArray ? sequence.slice() : Sequence(sequence).toArray()
32+
));
33+
}
34+
if (!isArray) {
35+
sequence = Sequence(sequence);
36+
if (!(sequence instanceof IndexedSequence)) {
37+
sequence = sequence.values();
38+
}
2539
}
26-
return Vector.empty().merge(values);
40+
return Vector.empty().merge(sequence);
2741
}
2842

2943
toString() {

‎type-definitions/Immutable.d.ts

Copy file name to clipboardExpand all lines: type-definitions/Immutable.d.ts
+12-6Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,27 +1122,33 @@ export interface Set<T> extends Sequence<T, T> {
11221122
export declare module Vector {
11231123

11241124
/**
1125-
* Returns an empty Vector.
1125+
* `Vector.empty()` returns a Vector of length 0.
11261126
*/
11271127
function empty<T>(): Vector<T>;
11281128

11291129
/**
1130-
* Returns a Vector of the same length of the provided `values` Array,
1131-
* containing the values at the same indices.
1130+
* `Vector.from()` returns a Vector of the same length of the provided
1131+
* `values` JavaScript Array or Sequence, containing the values at the
1132+
* same indices.
1133+
*
1134+
* If a non-indexed Sequence is provided, its keys will be discarded and
1135+
* its values will be used to fill the returned Vector.
11321136
*/
1133-
function fromArray<T>(values: Array<T>): Vector<T>;
1137+
function from<T>(array: Array<T>): Vector<T>;
1138+
function from<T>(sequence: Sequence<any, T>): Vector<T>;
11341139
}
11351140

11361141
/**
1137-
* Alias for Vector.empty()
1142+
* Alias for `Vector.empty()`
11381143
*/
11391144
export declare function Vector<T>(): Vector<T>;
11401145

11411146
/**
1142-
* Like Vector.forArray(), but accepts variable arugments instead of an Array.
1147+
* Like `Vector.from()`, but accepts variable arguments instead of an Array.
11431148
*/
11441149
export declare function Vector<T>(...values: T[]): Vector<T>;
11451150

1151+
11461152
export interface Vector<T> extends IndexedSequence<T> {
11471153

11481154
/**

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.