Skip to content

Instantly share code, notes, and snippets.

View NikolaiRuhe's full-sized avatar

Nikolai Ruhe NikolaiRuhe

View GitHub Profile
@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`.
///
func testRequestCancellation() async throws {
// Used to synchronize unit test with request task.
let meeting = TaskMeeting()
// This request just waits for the unit test in its handler.
let sut = Request(responseHandler: { _ in
try? await meeting.rendezvous {}
})
/// A type that synchronizes progress of two tasks.
///
/// After setup, two tasks should eventually call the `join` function. The
/// first task will suspend until the second task arrives and calls `join` as
/// well. Both tasks resume normally after that.
public final actor TaskRendezvous: Sendable {
private var completion: CheckedContinuation<Void, Error>? = nil
/// Suspends until a second task calls `join()` on this instance.
public func join() async throws {
@NikolaiRuhe
NikolaiRuhe / LocatedValueTest.swift
Created May 22, 2022 18:41
Using a result builder to gather source code locations for unit testing.
// example unit test:
func testAscii() async throws {
locate {
"Celcius"
"Farenheit"
"Kelvin"
"yes?"
"no?"
"yes;no;cancel"