Skip to content

Instantly share code, notes, and snippets.

View NikolaiRuhe's full-sized avatar

Nikolai Ruhe NikolaiRuhe

View GitHub Profile
@NikolaiRuhe
NikolaiRuhe / Streaming.swift
Last active September 22, 2025 10:11
A property wrapper that creates an AsyncStream yielding values when the property is set.
import os
/// A property wrapper that turns a stored property into an async stream.
///
/// Semantics are similar to Combine's `CurrentValueSubject`. Multiple clients
/// are allowed. Each client gets an individual stream.
///
/// The wrapped value itself inherits isolation from the surrounding type.
/// The stream is nonisolated, so it can be accessed from any execution context.
///
@NikolaiRuhe
NikolaiRuhe / gist:36384157d59c392c0a36331886198fbd
Created August 14, 2025 16:44
A property wrapper that creates an AsyncStream yielding values when the property is set.
import os
@propertyWrapper
public struct Streaming<Wrapped: Sendable> {
public var wrappedValue: Wrapped {
get { value }
set {
value = newValue
let continuations = protectedContinuations.withLock { $0.values }
for continuation in continuations {
@NikolaiRuhe
NikolaiRuhe / CancellingContinuation.swift
Last active May 5, 2025 12:52
A continuation that resumes automatically when the suspended task is cancelled.
import os.lock
/// `CancellingContinuation` is built on top of `CheckedContinuation` and
/// provides some additional features. It can be used as a drop-in replacement,
/// providing a similar API.
///
/// ## Automatic cancellation
/// When the suspended task is cancelled the continuation is automatically
/// resumed with a `CancellationError`. After that, normally resuming the
/// continuation from client is silently ignored.
@NikolaiRuhe
NikolaiRuhe / NRDelegateProxy
Created September 23, 2014 10:16
NRDelegateProxy is an Objective-C proxy class used for intercepting delegate callbacks.
// NRDelegateProxy is a base class for proxy objects that are used as intercepting
// delegates in other objects.
//
// NRDelegateProxy is subclassed to customize delegate behavior by selectively responding
// to some delegate methods while passing on other methods. It can thus be used to implement
// a chain of delegates where each delegate is responsible for some specific task.
//
// Below is an example using a UITextField. It sets up a chain of delegates that looks as follows:
//
// UITextField -> NRTextFilterProxy -> NRKeyboardHiderProxy -> ViewController
//
// Copyright (c) 2016, 2018 Nikolai Ruhe. All rights reserved.
//
import Foundation
public extension FileManager {
/// Calculate the allocated size of a directory and all its contents on the volume.
import XCTest
final class BarrierTests: XCTestCase {
func test() async {
let subsystem = Subsystem()
await withTaskGroup(of: Void.self) { group in
for index in 0 ..< 100 {
group.addTask { subsystem.performWork(id: index) }
}
actor A {
var iterator: AsyncStream<Void>.Iterator
init() {
iterator = AsyncStream<Void> { _ in }.makeAsyncIterator()
}
func f() async {
await iterator.next() // Cannot call mutating async function 'next()' on actor-isolated property 'iterator'
}
}
extension Binding where Value: MutableCollection, Value.Element: Identifiable {
subscript(_ id: Value.Element.ID) -> Binding<Value.Element> {
let index = wrappedValue.firstIndex { $0.id == id }
guard let index else {
fatalError("id not found: \(id)")
}
return self[index]
}
}
import XCTest
import SwiftUI
final class CaptureListTests: XCTestCase {
func testCaptureList() throws {
withBound("foo") { $boundValue in
print("value: \(boundValue), binding type: \(type(of: $boundValue))")
}
}
// TaskMeeting
// (c) 2022, Nikolai Ruhe
/// A type that synchronizes progress of two tasks.
public final actor TaskMeeting: Sendable {
private var completion: CheckedContinuation<Void, Error>? = nil
/// This method synchronizes two tasks so that both perform the closure at
/// the same time. Both tasks need to call `rendezvous`.
///