Queue
A queue for Swift concurrency
Install / Use
/learn @mattmassicotte/QueueREADME
Queue
A queue for Swift concurrency
This package exposes a single type: AsyncQueue. Conceptually, AsyncQueue is very similar to a DispatchQueue or OperationQueue. However, unlike these an AsyncQueue can accept async blocks. This exists to more easily enforce ordering across unstructured tasks without requiring explicit dependencies between them.
I've found this helpful when interfacing stateful asynchronous systems with synchronous code.
If you are looking for help handling actor reentrancy, check out Lock and Semaphore.
Integration
dependencies: [
.package(url: "https://github.com/mattmassicotte/Queue", from: "0.2.0")
]
Usage
let queue = AsyncQueue()
queue.addOperation {
await asyncFunction()
await anotherAsyncFunction()
}
// This can can also return the underlying Task,
// so you can cancel, or await a value
let task = queue.addOperation {
return await makeValue()
}
let value = try await task.value
By default, AsyncQueue will only run one operation at a time. But, it can be configured as a concurrent queue.
let queue = AsyncQueue(attributes: [.concurrent])
// these two may run concurrently
queue.addOperation { await asyncFunction() }
queue.addOperation { await asyncFunction() }
// This will only run once existing operations are complete, and will
// prevent new operations from starting until done
queue.addBarrierOperation {
await asyncFunction()
}
The AsyncQueue type has an errorSequence property, which can be used to detect uncaught errors out of band.
let queue = AsyncQueue(attributes: [.publishErrors])
Task {
for await error in queue.errorSequence {
print(error)
}
}
This package was inspired by Semaphore, which is another concurrency-related synchronization system that I've found very useful.
Alternatives
Contributing and Collaboration
I would love to hear from you! Issues or pull requests work great. Both a Matrix space and Discord are available for live help, but I have a strong bias towards answering in the form of documentation. You can also find me here.
I prefer collaboration, and would love to find ways to work together if you have a similar project.
I prefer indentation with tabs for improved accessibility. But, I'd rather you use the system you want and make a PR than hesitate because of whitespace.
By participating in this project you agree to abide by the Contributor Code of Conduct.
Related Skills
node-connect
339.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
339.3kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.9kCommit, push, and open a PR
