drop(while:)

Omits elements from the base sequence until a given error-throwing closure returns false, after which it passes through all remaining elements.

iOS
13.0+
macOS
10.15+
tvOS
13.0+
watchOS
6.0+
@preconcurrency func drop(while predicate: @escaping (Self.Element) async throws -> Bool) -> AsyncThrowingDropWhileSequence<Self>

Parameters

predicate

An error-throwing closure that takes an element as a parameter and returns a Boolean value indicating whether to drop the element from the modified sequence.

Returns

An asynchronous sequence that skips over values until the provided closure returns false or throws an error.

Use drop(while:) to omit elements from an asynchronous sequence until the element received meets a condition you specify. If the closure you provide throws an error, the sequence produces no elements and throws the error instead.

In this example, an asynchronous sequence called Counter produces Int values from 1 to 10. The predicate passed to the drop(while:) method throws an error if it encounters an even number, and otherwise returns true while it receives elements less than 5. Because the predicate throws when it receives 2 from the base sequence, this example throws without ever printing anything.

do {
    let stream = Counter(howHigh: 10)
        .drop {
            if $0 % 2 == 0 {
                throw EvenError()
            }
            return $0 < 5
        }
    for try await number in stream {
        print(number)
    }
} catch {
    print(error)
}
// Prints "EvenError()"

After the predicate returns false, the sequence never executes it again, and from then on the sequence passes through elements from its underlying sequence. A predicate that throws an error also never executes again.