Skip to content

Instantly share code, notes, and snippets.

@moyerr
moyerr / RecursiveModifier.swift
Created November 7, 2023 18:01
Apply a modifier to a view repeatedly with a recursive modifier
import SwiftUI
struct RecursiveModifier<Data: Collection, Transformed: View>: ViewModifier {
let data: Data
let transform: (Data.Element, AnyView) -> Transformed
func body(content: Content) -> some View {
var subsequence = data[...]
if let first = subsequence.popFirst() {
@moyerr
moyerr / SwiftUINavigation.swift
Created July 7, 2023 17:17
A demonstration of navigation in SwiftUI using NavigationStack and Environment actions
import SwiftUI
// MARK: Navigation
enum Screen: String, Hashable, CaseIterable, CustomStringConvertible {
case first, second, third
var description: String {
rawValue.capitalized
}
struct AsyncWrappedSequence<Base: Sequence>: AsyncSequence {
typealias Element = Base.Element
struct AsyncIterator<BaseIterator>: AsyncIteratorProtocol where BaseIterator == Base.Iterator {
var base: BaseIterator
mutating func next() async -> BaseIterator.Element? {
base.next()
}
}
@moyerr
moyerr / AnyAsyncSequence.swift
Created May 17, 2023 17:54
A type-erased AsyncSequence
struct AnyAsyncSequence<Element>: AsyncSequence {
struct AnyAsyncIterator: AsyncIteratorProtocol {
private let _next: () async throws -> Element?
init<Base: AsyncSequence>(_ base: Base) where Base.Element == Element {
var baseIterator = base.makeAsyncIterator()
self._next = { try await baseIterator.next() }
}
func next() async throws -> Element? {
@moyerr
moyerr / AsyncButton.swift
Last active January 26, 2023 22:16
A UIButton subclass that delivers its press events via an AsyncStream
import UIKit
class AsyncButton: UIButton {
private var continuation: AsyncStream<Void>.Continuation?
private(set) lazy var presses: AsyncStream<Void> = AsyncStream { continuation in
configureContinuation(continuation)
}
deinit { continuation?.finish() }
@moyerr
moyerr / InterleavedSequence.swift
Created September 17, 2022 14:04
An implementation of a sequence produced by interleaving two other sequences
struct InterleavedSequence<First: Sequence, Second: Sequence>: Sequence where First.Element == Second.Element {
let first: First
let second: Second
init(first: First, second: Second) {
self.first = first
self.second = second
}
func makeIterator() -> Iterator {