From b1037c768e518b728523885c497b2d5fe35b55bf Mon Sep 17 00:00:00 2001 From: Philippe Hausler Date: Wed, 13 Jul 2022 10:32:59 -0700 Subject: [PATCH 1/2] Modify the adjacent pairs guide into a proposal ready for review --- Evolution/NNNN-adjacent-pairs.md | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Evolution/NNNN-adjacent-pairs.md diff --git a/Evolution/NNNN-adjacent-pairs.md b/Evolution/NNNN-adjacent-pairs.md new file mode 100644 index 00000000..33d5c69c --- /dev/null +++ b/Evolution/NNNN-adjacent-pairs.md @@ -0,0 +1,55 @@ +# AdjacentPairs + +* Proposal: [SAA-NNNN](https://github.com/apple/swift-async-algorithms/blob/main/Evolution/NNNN-adjacent-pairs.md) +* Author(s): [László Teveli](https://github.com/tevelee) +* Review Manager: [Philippe Hausler](https://github.com/phausler) +* Status: **Implemented** +* Implementation: [[Source](https://github.com/apple/swift-async-algorithms/blob/main/Sources/AsyncAlgorithms/AsyncAdjacentPairsSequence.swift) | + [Tests](https://github.com/apple/swift-async-algorithms/blob/main/Tests/AsyncAlgorithmsTests/TestAdjacentPairs.swift)] +* Decision Notes: +* Bugs: + +## Introduction + +The `adjacentPairs()` API serve the purpose of collecting adjacent values. This operation is available for any `AsyncSequence` by calling the `adjacentPairs()` method. + +```swift +extension AsyncSequence { + public func adjacentPairs() -> AsyncAdjacentPairsSequence +} +``` + +## Detailed Design + +The `adjacentPairs()` algorithm produces elements of tuple (size of 2), containing a pair of the original `Element` type. + +The interface for this algorithm is available on all `AsyncSequence` types. The returned `AsyncAdjacentPairsSequence` conditionally conforms to `Sendable`. + +Its iterator keeps track of the previous element returned in the `next()` function and updates it in every turn. + +```swift +for await (first, second) in (1...5).async.adjacentPairs() { + print("First: \(first), Second: \(second)") +} + +// First: 1, Second: 2 +// First: 2, Second: 3 +// First: 3, Second: 4 +// First: 4, Second: 5 +``` + +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. + +```swift +Dictionary(uniqueKeysWithValues: url.lines.adjacentPairs()) +``` + +## Alternatives Considered + +This functionality is often written as a `zip` of a sequence together with itself, dropping its first element (`zip(source, source.dropFirst())`). + +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. + +## Credits/Inspiration + +The synchronous counterpart in [swift-algorithms](https://github.com/apple/swift-algorithms/blob/main/Guides/AdjacentPairs.md). From 7f1e015bb36b0a6749c26c56f593e351ab1f00d3 Mon Sep 17 00:00:00 2001 From: Philippe Hausler Date: Thu, 4 Aug 2022 09:42:59 -0700 Subject: [PATCH 2/2] Update the proposal # to 0005 --- Evolution/{NNNN-adjacent-pairs.md => 0005-adjacent-pairs.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Evolution/{NNNN-adjacent-pairs.md => 0005-adjacent-pairs.md} (95%) diff --git a/Evolution/NNNN-adjacent-pairs.md b/Evolution/0005-adjacent-pairs.md similarity index 95% rename from Evolution/NNNN-adjacent-pairs.md rename to Evolution/0005-adjacent-pairs.md index 33d5c69c..ce0b152d 100644 --- a/Evolution/NNNN-adjacent-pairs.md +++ b/Evolution/0005-adjacent-pairs.md @@ -1,6 +1,6 @@ # AdjacentPairs -* Proposal: [SAA-NNNN](https://github.com/apple/swift-async-algorithms/blob/main/Evolution/NNNN-adjacent-pairs.md) +* Proposal: [SAA-0005](https://github.com/apple/swift-async-algorithms/blob/main/Evolution/0005-adjacent-pairs.md) * Author(s): [László Teveli](https://github.com/tevelee) * Review Manager: [Philippe Hausler](https://github.com/phausler) * Status: **Implemented**