@@ -548,57 +548,75 @@ extension PrefixSequence: Sequence {
548
548
}
549
549
}
550
550
551
+
551
552
/// A sequence that lazily consumes and drops `n` elements from an underlying
552
553
/// `Base` iterator before possibly returning the first available element.
553
554
///
554
555
/// The underlying iterator's sequence may be infinite.
555
556
@_fixed_layout
556
- public struct DropWhileSequence < Base : IteratorProtocol > : Sequence , IteratorProtocol {
557
+ public struct DropWhileSequence < Base: Sequence > {
557
558
public typealias Element = Base . Element
558
-
559
+
559
560
@usableFromInline
560
- internal var _iterator : Base
561
+ internal var _iterator : Base . Iterator
561
562
@usableFromInline
562
- internal var _nextElement : Base . Element ?
563
-
563
+ internal var _nextElement : Element ?
564
+
564
565
@inlinable
565
- internal init (
566
- iterator: Base ,
567
- nextElement: Base . Element ? ,
568
- predicate: ( Base . Element ) throws -> Bool
569
- ) rethrows {
570
- self . _iterator = iterator
571
- self . _nextElement = nextElement ?? _iterator. next ( )
572
-
573
- while try _nextElement. flatMap ( predicate) == true {
566
+ internal init ( iterator: Base . Iterator , predicate: ( Element ) throws -> Bool ) rethrows {
567
+ _iterator = iterator
568
+ _nextElement = _iterator. next ( )
569
+
570
+ while let x = _nextElement, try predicate ( x) {
574
571
_nextElement = _iterator. next ( )
575
572
}
576
573
}
577
-
574
+
578
575
@inlinable
579
- public __consuming func makeIterator ( ) -> DropWhileSequence < Base > {
580
- return self
576
+ internal init ( _ base : Base , predicate : ( Element ) throws -> Bool ) rethrows {
577
+ self = try DropWhileSequence ( iterator : base . makeIterator ( ) , predicate : predicate )
581
578
}
579
+ }
582
580
583
- @inlinable
584
- public mutating func next( ) -> Element ? {
585
- guard _nextElement != nil else {
586
- return _iterator. next ( )
581
+ extension DropWhileSequence {
582
+ @_fixed_layout
583
+ public struct Iterator {
584
+ @usableFromInline
585
+ internal var _iterator : Base . Iterator
586
+ @usableFromInline
587
+ internal var _nextElement : Element ?
588
+
589
+ @inlinable
590
+ internal init ( _ iterator: Base . Iterator , nextElement: Element ? ) {
591
+ _iterator = iterator
592
+ _nextElement = nextElement
587
593
}
594
+ }
595
+ }
588
596
589
- let next = _nextElement
590
- _nextElement = nil
597
+ extension DropWhileSequence . Iterator : IteratorProtocol {
598
+ public typealias Element = Base . Element
599
+
600
+ @inlinable
601
+ public mutating func next( ) -> Element ? {
602
+ guard let next = _nextElement else { return nil }
603
+ _nextElement = _iterator. next ( )
591
604
return next
592
605
}
606
+ }
593
607
608
+ extension DropWhileSequence : Sequence {
609
+ @inlinable
610
+ public func makeIterator( ) -> Iterator {
611
+ return Iterator ( _iterator, nextElement: _nextElement)
612
+ }
613
+
594
614
@inlinable
595
615
public __consuming func drop(
596
616
while predicate: ( Element ) throws -> Bool
597
617
) rethrows -> DropWhileSequence < Base > {
598
- // If this is already a DropWhileSequence, avoid multiple
599
- // layers of wrapping and keep the same iterator.
600
- return try DropWhileSequence (
601
- iterator: _iterator, nextElement: _nextElement, predicate: predicate)
618
+ guard let x = _nextElement, try predicate ( x) else { return self }
619
+ return try DropWhileSequence ( iterator: _iterator, predicate: predicate)
602
620
}
603
621
}
604
622
@@ -1093,9 +1111,8 @@ extension Sequence {
1093
1111
@inlinable
1094
1112
public __consuming func drop(
1095
1113
while predicate: ( Element ) throws -> Bool
1096
- ) rethrows -> DropWhileSequence < Iterator > {
1097
- return try DropWhileSequence (
1098
- iterator: makeIterator ( ) , nextElement: nil , predicate: predicate)
1114
+ ) rethrows -> DropWhileSequence < Self > {
1115
+ return try DropWhileSequence ( self , predicate: predicate)
1099
1116
}
1100
1117
1101
1118
/// Returns a subsequence, up to the specified maximum length, containing the
0 commit comments