AsyncExtensions
AsyncExtensions provides a collection of operators that intends to ease the creation and combination of AsyncSequences
.
AsyncExtensions can be seen as a companion to Apple swift-async-algorithms. For now there is an overlap between both libraries, but when swift-async-algorithms becomes stable the overlapping operators while be deprecated in AsyncExtensions. Nevertheless AsyncExtensions will continue to provide the operators that the community needs and are not provided by Apple.
Adding AsyncExtensions as a Dependency
To use the AsyncExtensions
library in a SwiftPM project,
add the following line to the dependencies in your Package.swift
file:
.package(url: "https://github.com/sideeffect-io/AsyncExtensions"),
Include "AsyncExtensions"
as a dependency for your executable target:
.target(name: "<target>", dependencies: ["AsyncExtensions"]),
Finally, add import AsyncExtensions
to your source code.
Features
Channels
- AsyncBufferedChannel: Buffered communication channel between tasks. The elements are not shared and will be spread across consumers (same as AsyncStream)
- AsyncThrowingBufferedChannel: Throwing buffered communication channel between tasks
Subjects
- AsyncPassthroughSubject: Subject with a shared output
- AsyncThrowingPassthroughSubject: Throwing subject with a shared output
- AsyncCurrentValueSubject: Subject with a shared output. Maintain an replays its current value
- AsyncThrowingCurrentValueSubject: Throwing subject with a shared output. Maintain an replays its current value
- AsyncReplaySubject: Subject with a shared output. Maintain an replays a buffered amount of values
- AsyncThrowingReplaySubject: Throwing subject with a shared output. Maintain an replays a buffered amount of values
Combiners
zip(_:_:)
: Zips twoAsyncSequence
into an AsyncSequence of tuple of elementszip(_:_:_:)
: Zips threeAsyncSequence
into an AsyncSequence of tuple of elementszip(_:)
: Zips any async sequences into an array of elementsmerge(_:_:)
: Merges twoAsyncSequence
into an AsyncSequence of elementsmerge(_:_:_:)
: Merges threeAsyncSequence
into an AsyncSequence of elementsmerge(_:)
: Merges anyAsyncSequence
into an AsyncSequence of elementswithLatest(_:)
: Combines elements from self with the last known element from an otherAsyncSequence
withLatest(_:_:)
: Combines elements from self with the last known elements from two other async sequences
Creators
- AsyncEmptySequence: Creates an
AsyncSequence
that immediately finishes - AsyncFailSequence: Creates an
AsyncSequence
that immediately fails - AsyncJustSequence: Creates an
AsyncSequence
that emits an element an finishes - AsyncThrowingJustSequence: Creates an
AsyncSequence
that emits an elements and finishes bases on a throwing closure - AsyncLazySequence: Creates an
AsyncSequence
of the elements from the base sequence - AsyncTimerSequence: Creates an
AsyncSequence
that emits a date value periodically - AsyncStream Pipe: Creates an AsyncStream and returns a tuple standing for its inputs and outputs
Operators
handleEvents()
: Executes closures during the lifecycle of the selfmapToResult()
: Maps elements and failure from self to aResult
typeprepend(_:)
: Prepends an element to selfscan(_:_:)
: Transforms elements from self by providing the current element to a closure along with the last value returned by the closureassign(_:)
: Assigns elements from self to a propertycollect(_:)
: Iterate over elements from self and execute a closureeraseToAnyAsyncSequence()
: Erases to AnyAsyncSequenceflatMapLatest(_:)
: Transforms elements from self into aAsyncSequence
and republishes elements sent by the most recently receivedAsyncSequence
when self is anAsyncSequence
ofAsyncSequence
multicast(_:)
: Shares values from self to several consumers thanks to a provided Subjectshare()
: Shares values from self to several consumersswitchToLatest()
: Republishes elements sent by the most recently receivedAsyncSequence
when self is anAsyncSequence
ofAsyncSequence
More operators and extensions are to come. Pull requests are of course welcome.