swift-primitives/swift-standard-library-extensions
Targeted extensions to the Swift standard library: typed-throws overloads for closure-based stdlib APIs, result-builder DSLs for the standard collection types, safe-indexing accessors, and a pre-Swift-6.4-compiler nonisolated(nonsending) compatibility overload of `withTaskCance
Quick Start
Pin to a version range and import:
import Standard_Library_ExtensionsTyped throws across stdlib closures
The standard library's closure-based APIs (withUnsafeBufferPointer, withUnsafeBytes, withUnsafePointer, withUnsafeTemporaryAllocation, Span.withUnsafeBufferPointer, Array.withUnsafeBufferPointer, …) are declared rethrows, which erases the closure's typed error. This package adds parallel overloads that preserve throws(E):
enum ParseError: Error { case invalid }
let bytes: [UInt8] = [0x48, 0x65, 0x6c]
let first: UInt8 = try bytes.withUnsafeBufferPointer { buffer throws(ParseError) in
guard buffer.count > 0 else { throw .invalid }
return buffer[0]
}
// Error type ParseError is preserved at the call site.Without this package, the throws(ParseError) constraint is lost the moment the closure crosses a rethrows boundary.
Declarative collection construction with control flow
Result-builder DSLs are provided for Array, ArraySlice, ContiguousArray, Set, Dictionary, CollectionOfOne, Optional, Range, ClosedRange, Bool, Result, String, and Substring:
let numbers = Array {
1
2
if includeThree {
3
}
for n in 4...6 {
n
}
}
// Builds the array declaratively without intermediate `+` concatenations.Safe indexing
let xs = [10, 20, 30]
xs[safe: 1..<2] // Optional(ArraySlice([20]))
xs[safe: 5..<10] // nil — out of bounds, no crash
xs[safe: -1..<2] // nil — invalid range, no crashnonisolated(nonsending) cancellation handler
Before the Swift 6.4 compiler, the standard library's withTaskCancellationHandler is not nonisolated(nonsending), which can introduce executor hops. On those compilers, this package's compatibility overload preserves the caller's isolation context. Swift 6.4 and later compilers use the standard library's equivalent overload directly:
let result = try await withTaskCancellationHandler {
try await someOperation()
} onCancel: {
cancelExternalResource()
}
// No unnecessary suspension at the operation boundary.Installation
Add to your Package.swift:
dependencies: [
.package(
url: "https://github.com/swift-primitives/swift-standard-library-extensions.git",
from: "0.1.0"
),
]Then add the target dependency:
.target(
name: "YourTarget",
dependencies: [
.product(name: "Standard Library Extensions", package: "swift-standard-library-extensions"),
]
)Architecture
The package ships two targets:
| Target | Role | |--------|------| | Standard Library Extensions | Main target — extensions and overloads. | | Standard Library Extensions Test Support | Test-support shell for downstream packages that wish to import test fixtures. |
Source files follow one type per file; nested types use the Type.NestedType.swift naming pattern (e.g., Array.Builder.swift, Result.Builder.swift).
Platform Support
The package is nonisolated(nonsending)-aware and uses Swift 6 language features: typed throws (throws(E)), ~Copyable, ~Escapable, LifetimeDependence, and SuppressedAssociatedTypes. Built against Swift 6.3 (stable) and Swift 6.4-dev (nightly).
| Platform | Minimum | |----------|---------| | macOS | 26.0 | | iOS | 26.0 | | tvOS | 26.0 | | watchOS | 26.0 | | visionOS | 26.0 | | Linux | Swift 6.3 | | Embedded Swift | Swift 6.4-dev |
Stability
Pre-1.0. APIs are still evolving and may change between minor versions until 1.0.0 is tagged. Within the 0.x.y line, 0.<major>.0 releases may carry breaking changes; 0.<major>.<patch> releases are additive only.
License
Apache License 2.0 — see LICENSE.md.
Package Metadata
Repository: swift-primitives/swift-standard-library-extensions
Default branch: main
README: README.md