@@ -13,8 +13,8 @@ import {
13
13
IndexedCollection ,
14
14
} from './Collection' ;
15
15
import { isCollection } from './predicates/isCollection' ;
16
- import { isKeyed } from './predicates/isKeyed' ;
17
- import { isIndexed } from './predicates/isIndexed' ;
16
+ import { IS_KEYED_SYMBOL , isKeyed } from './predicates/isKeyed' ;
17
+ import { IS_INDEXED_SYMBOL , isIndexed } from './predicates/isIndexed' ;
18
18
import { isOrdered , IS_ORDERED_SYMBOL } from './predicates/isOrdered' ;
19
19
import { isSeq } from './predicates/isSeq' ;
20
20
import {
@@ -587,6 +587,100 @@ export function skipWhileFactory(collection, predicate, context, useKeys) {
587
587
return skipSequence ;
588
588
}
589
589
590
+ class ConcatSeq extends Seq {
591
+ constructor ( iterables ) {
592
+ this . _wrappedIterables = iterables . flatMap ( iterable => {
593
+ if ( iterable . _wrappedIterables ) {
594
+ return iterable . _wrappedIterables ;
595
+ }
596
+ return [ iterable ] ;
597
+ } ) ;
598
+ this . size = this . _wrappedIterables . reduce ( ( sum , iterable ) => {
599
+ if ( sum !== undefined ) {
600
+ const size = iterable . size ;
601
+ if ( size !== undefined ) {
602
+ return sum + size ;
603
+ }
604
+ }
605
+ } , 0 ) ;
606
+ this [ IS_KEYED_SYMBOL ] = this . _wrappedIterables [ 0 ] [ IS_KEYED_SYMBOL ] ;
607
+ this [ IS_INDEXED_SYMBOL ] = this . _wrappedIterables [ 0 ] [ IS_INDEXED_SYMBOL ] ;
608
+ this [ IS_ORDERED_SYMBOL ] = this . _wrappedIterables [ 0 ] [ IS_ORDERED_SYMBOL ] ;
609
+ }
610
+
611
+ __iterateUncached ( fn , reverse ) {
612
+ if ( this . _wrappedIterables . length === 0 ) {
613
+ return ;
614
+ }
615
+
616
+ if ( reverse ) {
617
+ return this . cacheResult ( ) . __iterate ( fn , reverse ) ;
618
+ }
619
+
620
+ let iterableIndex = 0 ;
621
+ const useKeys = isKeyed ( this ) ;
622
+ const iteratorType = useKeys ? ITERATE_ENTRIES : ITERATE_VALUES ;
623
+ let currentIterator = this . _wrappedIterables [ iterableIndex ] . __iterator (
624
+ iteratorType ,
625
+ reverse
626
+ ) ;
627
+
628
+ let keepGoing = true ;
629
+ let index = 0 ;
630
+ while ( keepGoing ) {
631
+ let next = currentIterator . next ( ) ;
632
+ while ( next . done ) {
633
+ iterableIndex ++ ;
634
+ if ( iterableIndex === this . _wrappedIterables . length ) {
635
+ return index ;
636
+ }
637
+ currentIterator = this . _wrappedIterables [ iterableIndex ] . __iterator (
638
+ iteratorType ,
639
+ reverse
640
+ ) ;
641
+ next = currentIterator . next ( ) ;
642
+ }
643
+ const fnResult = useKeys
644
+ ? fn ( next . value [ 1 ] , next . value [ 0 ] , this )
645
+ : fn ( next . value , index , this ) ;
646
+ keepGoing = fnResult !== false ;
647
+ index ++ ;
648
+ }
649
+ return index ;
650
+ }
651
+
652
+ __iteratorUncached ( type , reverse ) {
653
+ if ( this . _wrappedIterables . length === 0 ) {
654
+ return new Iterator ( iteratorDone ) ;
655
+ }
656
+
657
+ if ( reverse ) {
658
+ return this . cacheResult ( ) . __iterator ( type , reverse ) ;
659
+ }
660
+
661
+ let iterableIndex = 0 ;
662
+ let currentIterator = this . _wrappedIterables [ iterableIndex ] . __iterator (
663
+ type ,
664
+ reverse
665
+ ) ;
666
+ return new Iterator ( ( ) => {
667
+ let next = currentIterator . next ( ) ;
668
+ while ( next . done ) {
669
+ iterableIndex ++ ;
670
+ if ( iterableIndex === this . _wrappedIterables . length ) {
671
+ return next ;
672
+ }
673
+ currentIterator = this . _wrappedIterables [ iterableIndex ] . __iterator (
674
+ type ,
675
+ reverse
676
+ ) ;
677
+ next = currentIterator . next ( ) ;
678
+ }
679
+ return next ;
680
+ } ) ;
681
+ }
682
+ }
683
+
590
684
export function concatFactory ( collection , values ) {
591
685
const isKeyedCollection = isKeyed ( collection ) ;
592
686
const iters = [ collection ]
@@ -618,22 +712,7 @@ export function concatFactory(collection, values) {
618
712
}
619
713
}
620
714
621
- let concatSeq = new ArraySeq ( iters ) ;
622
- if ( isKeyedCollection ) {
623
- concatSeq = concatSeq . toKeyedSeq ( ) ;
624
- } else if ( ! isIndexed ( collection ) ) {
625
- concatSeq = concatSeq . toSetSeq ( ) ;
626
- }
627
- concatSeq = concatSeq . flatten ( true ) ;
628
- concatSeq . size = iters . reduce ( ( sum , seq ) => {
629
- if ( sum !== undefined ) {
630
- const size = seq . size ;
631
- if ( size !== undefined ) {
632
- return sum + size ;
633
- }
634
- }
635
- } , 0 ) ;
636
- return concatSeq ;
715
+ return new ConcatSeq ( iters ) ;
637
716
}
638
717
639
718
export function flattenFactory ( collection , depth , useKeys ) {
0 commit comments