8000 generalize concat and flatten. move flatten and flatMap to Sequence · powercoder23/immutable-js@661b045 · GitHub
[go: up one dir, main page]

Skip to content

Commit 661b045

Browse files
committed
generalize concat and flatten. move flatten and flatMap to Sequence
1 parent a14a66a commit 661b045

File tree

5 files changed

+159
-143
lines changed

5 files changed

+159
-143
lines changed

dist/Immutable.d.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,22 @@ declare module 'immutable' {
461461
*/
462462
first(): V;
463463

464+
/**
465+
* Flat-maps the Sequence.
466+
*/
467+
flatMap<MK, MV>(
468+
mapper: (value?: V, key?: K, seq?: Sequence<K, V>) => Sequence<MK, MV>,
469+
context?: any
470+
): Sequence<MK, MV>;
471+
472+
/**
473+
* Flattens nested Sequences by one level.
474+
*
475+
* Note: `flatten` operates on Sequence<any, Sequence<K, V>> and
476+
* returns Sequence<K, V>
477+
*/
478+
flatten(): Sequence<any, any>;
479+
464480
/**
465481
* Returns a new sequence with this sequences's keys as it's values, and this
466482
* sequences's values as it's keys.
@@ -901,7 +917,8 @@ declare module 'immutable' {
901917
): number;
902918

903919
/**
904-
* Flat-maps the Sequence.
920+
* Returns IndexedSequence<M>
921+
* @override
905922
*/
906923
flatMap<M>(
907924
mapper: (value?: T, index?: number, seq?: IndexedSequence<T>) => IndexedSequence<M>,
@@ -913,10 +930,8 @@ declare module 'immutable' {
913930
): IndexedSequence<M>;
914931

915932
/**
916-
* Flattens nested Sequences by one level.
917-
*
918-
* Note: `flatten` operates on IndexedSequence<IndexedSequence<T>> and
919-
* returns IndexedSequence<T>
933+
* Returns IndexedSequence<T>
934+
* @override
920935
*/
921936
flatten(): IndexedSequence<any>;
922937

dist/Immutable.js

Lines changed: 47 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -292,29 +292,13 @@ var $Sequence = Sequence;
292292
for (var values = [],
293293
$__2 = 0; $__2 < arguments.length; $__2++)
294294
values[$__2] = arguments[$__2];
295-
var sequences = [this].concat(values.map((function(value) {
296-
return $Sequence(value);
297-
})));
298-
var concatSequence = this.__makeSequence();
299-
concatSequence.length = sequences.reduce((function(sum, seq) {
300-
return sum != null && seq.length != null ? sum + seq.length : undefined;
301-
}), 0);
302-
concatSequence.__iterateUncached = (function(fn, reverse) {
303-
var iterations = 0;
304-
var stoppedIteration;
305-
var lastIndex = sequences.length - 1;
306-
for (var ii = 0; ii <= lastIndex && !stoppedIteration; ii++) {
307-
var seq = sequences[reverse ? lastIndex - ii : ii];
308-
iterations += seq.__iterate((function(v, k, c) {
309-
if (fn(v, k, c) === false) {
310-
stoppedIteration = true;
311-
return false;
312-
}
313-
}), reverse);
314-
}
315-
return iterations;
316-
});
317-
return concatSequence;
295+
return concatFactory(this, values, true);
296+
},
297+
flatten: function() {
298+
return flattenFactory(this, true);
299+
},
300+
flatMap: function(mapper, thisArg) {
301+
return this.map(mapper, thisArg).flatten();
318302
},
319303
reverse: function() {
320304
var sequence = this;
@@ -670,17 +654,7 @@ var $IndexedSequence = IndexedSequence;
670654
for (var values = [],
671655
$__3 = 0; $__3 < arguments.length; $__3++)
672656
values[$__3] = arguments[$__3];
673-
var sequences = [this].concat(values);
674-
var concatSequence = Sequence(sequences).flatten();
675-
concatSequence.length = sequences.reduce((function(sum, seq) {
676-
if (sum !== undefined) {
677-
var len = Sequence(seq).length;
678-
if (len != null) {
679-
return sum + len;
680-
}
681-
}
682-
}), 0);
683-
return concatSequence;
657+
return concatFactory(this, values, false);
684658
},
685659
reverse: function() {
686660
var sequence = this;
@@ -739,28 +713,7 @@ var $IndexedSequence = IndexedSequence;
739713
return numArgs === 1 ? spliced : spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum));
740714
},
741715
flatten: function() {
742-
var sequence = this;
743-
var flatSequence = this.__makeSequence();
744-
flatSequence.__iterateUncached = function(fn, reverse, reverseIndices) {
745-
var $__0 = this;
746-
var iterations = 0;
747-
var maxIndex = this.length - 1;
748-
sequence.__iterate((function(seq) {
749-
var stopped = false;
750-
Sequence(seq).__iterate((function(v) {
751-
if (fn(v, reverseIndices ? maxIndex - iterations++ : iterations++, $__0) === false) {
752-
stopped = true;
753-
return false;
754-
}
755-
}), reverse);
756-
return !stopped;
757-
}), reverse);
758-
return iterations;
759-
};
760-
return flatSequence;
761-
},
762-
flatMap: function(mapper, thisArg) {
763-
return this.map(mapper, thisArg).flatten();
716+
return flattenFactory(this, false);
764717
},
765718
skip: function(amount) {
766719
return skipFactory(this, amount, false);
@@ -1009,6 +962,44 @@ function skipWhileFactory(sequence, predicate, thisArg, useKeys) {
1009962
};
1010963
return skipSequence;
1011964
}
965+
function concatFactory(sequence, values, useKeys) {
966+
var sequences = [sequence].concat(values);
967+
var concatSequence = Sequence(sequences);
968+
if (useKeys) {
969+
concatSequence = concatSequence.toKeyedSeq();
970+
}
971+
concatSequence = concatSequence.flatten();
972+
concatSequence.length = sequences.reduce((function(sum, seq) {
973+
if (sum !== undefined) {
974+
var len = Sequence(seq).length;
975+
if (len != null) {
976+
return sum + len;
977+
}
978+
}
979+
}), 0);
980+
return concatSequence;
981+
}
982+
function flattenFactory(sequence, useKeys) {
983+
var flatSequence = sequence.__makeSequence();
984+
flatSequence.__iterateUncached = function(fn, reverse, reverseIndices) {
985+
var $__0 = this;
986+
var iterations = 0;
987+
var len = this.length;
988+
sequence.__iterate((function(seq) {
989+
var stopped = false;
990+
Sequence(seq).__iterate((function(v, k) {
991+
iterations++;
992+
if (fn(v, useKeys ? k : reverseIndices ? len - iterations : iterations - 1, $__0) === false) {
993+
stopped = true;
994+
return false;
995+
}
996+
}), reverse);
997+
return !stopped;
998+
}), reverse);
999+
return iterations;
1000+
};
1001+
return flatSequence;
1002+
}
10121003
function not(predicate) {
10131004
return function() {
10141005
return !predicate.apply(this, arguments);

0 commit comments

Comments
 (0)
0