Swift Async Algorithms started off with a goal for source stability. This means that building against newer versions should not break older code using it.
Since we signed up for semantic versioning no public interface shall be broken (and the only potential exception to this is a transition of major versions). However we do want to ensure that versioning is meaningful and follows a cadence of regular releases. Tying releases to a specific chronological guarantee is not nearly as meaningful since it is not tied to a binary release of an operating system nor is it tied to any specific cadence of releases of hardware. Instead it makes more sense to build semantic release cadences around feature sets that indicate the start and end of periods of work around certain ideas.
The 1.0 release was built around getting a set of ideas of the fundamental algorithms to build a framework that is cohesive. This meant expanding upon the AsyncSequence types provided in the standard library (specifically the _Concurrency module) for the ones that would still be commonly needed but not the most fundamental expected for any use. Part of the focus was that of interfacing with clocks and durations, others were focused upon buffering and splitting.
Since we have a released semantic version we need to demarcate the start of a new release for development. Swift modules thankfully have the capability of being specified of a certain branch or release and can specify a valid range for use. This means that developers may be able to specify the range of usage as 1.0 or allow 1.0 and beyond or require 1.1 or later. It is expected that any cut release version should be self contained and usable within that version. That means our qualification of which should ensure that any start of development for 1.1 should contain stable development for landing that released version. Since any new development will be on the main branch, any minor fixes that need to be applied to the 1.0.4 release would then be cherry picked (if needed) and the version of the release would then be bumped to 1.0.5. It is also expected that those fixes would be present on the main branch such that they are available for the eventual 1.1.
So at this point the question is: what constitutes 1.1? Since the idea is not to be bound to a yearly cadence (either shorter or longer than year) but instead bound to a conceptual grouping - 1.1 will have a conceptual grouping of adding in functionality to replace existing non-Swift-Concurrency systems with Swift Concurrency.
So far there are a few important algorithms to bring forward for this release. These all have similar systems that exist in other frameworks or are intrinsically linked to interfacing with non-Swift-Concurrency systems.
share()
MultiProducerSingleConsumerChannel
enumerated()
deferred()
withDeadline
withLatestFrom
mapFailure
throttle
(this is just a revisit of behaviors)
In addition to these areas of focus there are a few language improvements that are worth considering as well.
- variadic generics (N-ary zip et al)
- adopting some types (by deprecating old initializers and adding new ones with typed throws)
- typed throws
Of course there is a chance where not all of these will make it; for 1.0 throttle was deferred from the release due to complications with the behaviors. However, any deferred algorithm from 1.1 will be something of strong consideration for 1.2.
AsyncAlgorithms is not my sole responsibility so I will need some help from the community to make this deliverable happen. Some folks have already posted patches for the algorithms and features listed. In order to move them forward the major things that need to happen is first and foremost communication around what is and is not finished (the other requirements are somewhat flexible and time permitting can be relaxed), the other (more flexible requirements) are a write-up of a proposal, an implementation, and tests covering at least a good swath of the behaviors and code coverage. In the coming days I will be either promoting bugs or writing up issues for a 1.1 milestone.
This general process is something that I would also like to refine and perhaps advocate to other packages like swift-algorithms or numerics etc. Some of this process was inspired from some insight from @nnnnnnnn from ArgumentParser.
I would love to hear what aspects of this quasi-pitch should be refined or changed to better suit the needs of the community.