diff --git a/stdlib/public/core/Sequence.swift b/stdlib/public/core/Sequence.swift index f4d9125370d48..8e72742ed2bea 100644 --- a/stdlib/public/core/Sequence.swift +++ b/stdlib/public/core/Sequence.swift @@ -893,10 +893,9 @@ extension Sequence { // FIXME: Create reusable RingBuffer // Put incoming elements into a ring buffer to save space. Once all - // elements are consumed, reorder the ring buffer into an `Array` - // and return it. This saves memory for sequences particularly longer - // than `maxLength`. - var ringBuffer: [Element] = [] + // elements are consumed, reorder the ring buffer into a copy and return it. + // This saves memory for sequences particularly longer than `maxLength`. + var ringBuffer = ContiguousArray() ringBuffer.reserveCapacity(Swift.min(maxLength, underestimatedCount)) var i = 0 @@ -906,19 +905,18 @@ extension Sequence { ringBuffer.append(element) } else { ringBuffer[i] = element - i += 1 - i %= maxLength + i = (i + 1) % maxLength } } if i != ringBuffer.startIndex { - var rotated: [Element] = [] + var rotated = ContiguousArray() rotated.reserveCapacity(ringBuffer.count) rotated += ringBuffer[i..() + var ringBuffer = ContiguousArray() var i = ringBuffer.startIndex for element in self { @@ -986,11 +984,10 @@ extension Sequence { } else { result.append(ringBuffer[i]) ringBuffer[i] = element - i += 1 - i %= k + i = (i + 1) % k } } - return result + return Array(result) } /// Returns a sequence by skipping the initial, consecutive elements that @@ -1072,7 +1069,7 @@ extension Sequence { public __consuming func prefix( while predicate: (Element) throws -> Bool ) rethrows -> [Element] { - var result: [Element] = [] + var result = ContiguousArray() for element in self { guard try predicate(element) else { @@ -1080,7 +1077,7 @@ extension Sequence { } result.append(element) } - return result + return Array(result) } }