Skip to content

Commit e3a18a0

Browse files
authored
Modify the adjacent pairs guide into a proposal ready for review (#178)
* Modify the adjacent pairs guide into a proposal ready for review * Update the proposal # to 0005
1 parent b92ba05 commit e3a18a0

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

Diff for: Evolution/0005-adjacent-pairs.md

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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

Comments
 (0)