Skip to content

Instantly share code, notes, and snippets.

@JadenGeller
JadenGeller / RequestBatcher.swift
Created February 27, 2024 22:40
Request batcher using Swift async
actor RequestBatcher<Request, Response> {
var maxBatch: Int
var maxDelay: Duration
var priority: TaskPriority?
var dispatchBatch: ([Request]) async -> [Result<Response, Error>]
init(maxBatch: Int, maxDelay: Duration, dispatchBatch: @escaping ([Request]) async -> [Result<Response, Error>]) {
self.maxBatch = maxBatch
self.maxDelay = maxDelay
self.dispatchBatch = dispatchBatch
@JadenGeller
JadenGeller / Pipeline.swift
Created January 21, 2024 05:37
Parallelize sequential steps in a pipeline with streaming inputs
protocol PipelineStep {
associatedtype Context
associatedtype Downstream: PipelineStep
func step(with context: Context) async throws -> Downstream
}
protocol IdleCheckablePipelinewStep: PipelineStep {
var isIdle: Bool { get }
}
@JadenGeller
JadenGeller / BoundsSegmentedSequence.swift
Last active January 4, 2024 03:14
Efficiently split a sorted sequence with a list of sorted bounds
extension RandomAccessCollection {
/// A sequence that partitions a sorted collection into non-overlapping segments based on a sorted sequence of boundaries.
///
/// If N bounds are provided, the resulting sequence contains N + 1 segments, since the segment before the first boundary
/// and the segment after the last boundary are both included.
///
/// - Parameter bounds: A sequence of bounds used to partition the collection.
/// - Parameter areInIncreasingOrder: A predicate that determines whether an element should be included
/// in the segment before the boundary.
/// - Returns: A sequence of collection subseqences partitioned by the given bounds.
@JadenGeller
JadenGeller / DragModifier.swift
Last active May 22, 2024 15:23
NSFilePromiseProvider with SwiftUI, to drag a file that's loaded asynchronously
import SwiftUI
import UniformTypeIdentifiers
struct FileDragProvider: NSViewRepresentable {
var filePromise: FilePromise
var preview: PlatformImage
class NSViewType: NSView, NSFilePromiseProviderDelegate, NSDraggingSource {
var filePromise: FilePromise
var preview: PlatformImage
@JadenGeller
JadenGeller / UnificationSystem.swift
Last active December 17, 2023 00:43
Union-Find disjoint-set data structure in Swift
public protocol UnificationSystemProtocol {
associatedtype Variable
mutating func makeFreshVariable() -> Variable
mutating func canonicalVariable(for variable: Variable) -> Variable
@discardableResult
mutating func unify(_ first: Variable, _ second: Variable) -> Bool
}
public struct UnificationSystem: UnificationSystemProtocol {
public typealias Variable = Int
protocol Lattice {
static func join(_ lhs: Self, _ rhs: Self) -> Self
static func meet(_ lhs: Self, _ rhs: Self) -> Self
}
extension Lattice {
mutating func join(with other: Self) {
self = .join(self, other)
}
mutating func meet(with other: Self) {
@JadenGeller
JadenGeller / BufferLoader.swift
Created November 18, 2023 02:07
BufferLoader
struct BufferLoader {
var buffer: UnsafeRawBufferPointer
var byteOffset: Int = 0
mutating func loadUnaligned<T>(as type: T.Type) -> T {
defer { byteOffset += MemoryLayout<T>.size }
return buffer.loadUnaligned(fromByteOffset: byteOffset, as: T.self)
}
}
extension UnsafeRawBufferPointer {
@JadenGeller
JadenGeller / Semaphore.swift
Created November 17, 2023 19:09
Semaphore using Swift async
actor Semaphore {
private var capacity: Int {
didSet {
assert(capacity >= 0)
}
}
struct Waiter {
var priority: TaskPriority
var continuation: CheckedContinuation<Void, Never>
}
@JadenGeller
JadenGeller / DeterministicRandomNumberGenerator.swift
Created November 11, 2023 20:25
uses GameplayKit GKMersenneTwisterRandomSource
import GameplayKit
struct DeterministicRandomNumberGenerator: RandomNumberGenerator {
private let randomSource: GKMersenneTwisterRandomSource
init(seed: UInt64) {
randomSource = GKMersenneTwisterRandomSource(seed: seed)
}
mutating func next() -> UInt64 {
@JadenGeller
JadenGeller / Grouping.swift
Last active November 1, 2023 05:02
grouping function like split or chunked, but gives you access to the whole group so far in the predicate
extension Collection {
func grouping(isMember: (SubSequence, Element) throws -> Bool) rethrows -> [SubSequence] {
var result: [SubSequence] = []
var start = self.startIndex
for end in self.indices.dropFirst() {
let slice = self[start...end]
if try !isMember(slice, self[end]) {
result.append(self[start..<end])
start = end