|
| 1 | +# AdjacentPairs |
| 2 | + |
| 3 | +* Proposal: [SAA-0005](https://github.com/apple/swift-async-algorithms/blob/main/Evolution/0005-adjacent-pairs.md) |
| 4 | +* Author(s): [László Teveli](https://github.com/tevelee) |
| 5 | +* Review Manager: [Philippe Hausler](https://github.com/phausler) |
| 6 | +* Status: **Implemented** |
| 7 | +* Implementation: [[Source](https://github.com/apple/swift-async-algorithms/blob/main/Sources/AsyncAlgorithms/AsyncAdjacentPairsSequence.swift) | |
| 8 | + [Tests](https://github.com/apple/swift-async-algorithms/blob/main/Tests/AsyncAlgorithmsTests/TestAdjacentPairs.swift)] |
| 9 | +* Decision Notes: |
| 10 | +* Bugs: |
| 11 | + |
| 12 | +## Introduction |
| 13 | + |
| 14 | +The `adjacentPairs()` API serve the purpose of collecting adjacent values. This operation is available for any `AsyncSequence` by calling the `adjacentPairs()` method. |
| 15 | + |
| 16 | +```swift |
| 17 | +extension AsyncSequence { |
| 18 | + public func adjacentPairs() -> AsyncAdjacentPairsSequence<Self> |
| 19 | +} |
| 20 | +``` |
| 21 | + |
| 22 | +## Detailed Design |
| 23 | + |
| 24 | +The `adjacentPairs()` algorithm produces elements of tuple (size of 2), containing a pair of the original `Element` type. |
| 25 | + |
| 26 | +The interface for this algorithm is available on all `AsyncSequence` types. The returned `AsyncAdjacentPairsSequence` conditionally conforms to `Sendable`. |
| 27 | + |
| 28 | +Its iterator keeps track of the previous element returned in the `next()` function and updates it in every turn. |
| 29 | + |
| 30 | +```swift |
| 31 | +for await (first, second) in (1...5).async.adjacentPairs() { |
| 32 | + print("First: \(first), Second: \(second)") |
| 33 | +} |
| 34 | + |
| 35 | +// First: 1, Second: 2 |
| 36 | +// First: 2, Second: 3 |
| 37 | +// First: 3, Second: 4 |
| 38 | +// First: 4, Second: 5 |
| 39 | +``` |
| 40 | + |
| 41 | +It composes well with the [Dictionary.init(_:uniquingKeysWith:)](https://github.com/apple/swift-async-algorithms/blob/main/Guides/Collections.md) API that deals with `AsyncSequence` of tuples. |
| 42 | + |
| 43 | +```swift |
| 44 | +Dictionary(uniqueKeysWithValues: url.lines.adjacentPairs()) |
| 45 | +``` |
| 46 | + |
| 47 | +## Alternatives Considered |
| 48 | + |
| 49 | +This functionality is often written as a `zip` of a sequence together with itself, dropping its first element (`zip(source, source.dropFirst())`). |
| 50 | + |
| 51 | +It's such a dominant use-case, the [swift-algorithms](https://github.com/apple/swift-algorithms) package also [introduced](https://github.com/apple/swift-algorithms/pull/119) it to its collection of algorithms. |
| 52 | + |
| 53 | +## Credits/Inspiration |
| 54 | + |
| 55 | +The synchronous counterpart in [swift-algorithms](https://github.com/apple/swift-algorithms/blob/main/Guides/AdjacentPairs.md). |
0 commit comments