Skip to content

Instantly share code, notes, and snippets.

@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
@JadenGeller
JadenGeller / ResultView.swift
Created October 31, 2023 17:08
Async view for awaiting tasks
import SwiftUI
protocol DeferedTask {
associatedtype Success
func run() async throws -> Success
}
struct ResultView<T: DeferedTask, ID: Equatable, Content: View>: View {
var task: T
var id: KeyPath<T, ID>
@JadenGeller
JadenGeller / LimitedLibraryPicker.swift
Created October 31, 2023 01:00
SwiftUI view for displaying limited photo library picker
import SwiftUI
import PhotosUI
struct LimitedLibraryPicker: UIViewControllerRepresentable {
@Binding var isPresented: Bool
func makeUIViewController(context: Context) -> UIViewController {
.init()
}
@JadenGeller
JadenGeller / BugRepro.swift
Last active October 26, 2023 23:57
SwiftUI bug! onKeyPress resets binding to initial state
import SwiftUI
struct OuterView: View {
@State var count: Int = 0
var body: some View {
VStack {
MiddleView(count: $count)
.onAppear {
count += 100
@JadenGeller
JadenGeller / ActionDispatch.swift
Last active October 26, 2023 20:11
SwiftUI action handling, similar to KeyPress but for generic actions
import SwiftUI
struct ActionDispatch<Action, Content: View>: View {
@ViewBuilder var content: (@escaping (Action) -> ActionResult) -> Content
@State var handler: ActionHandler<Action> = .unhandled
// ^use @Box here instead of @State here to avoid the extra re-rendering: https://gist.github.com/JadenGeller/b6ce5db2470aeabcf2f8e936cb3a5725
init(_ type: Action.Type, content: @escaping (@escaping (Action) -> ActionResult) -> Content) {
self.content = content
}
@propertyWrapper
struct Box<T> {
class Storage {
var value: T
init(_ value: T) {
self.value = value
}
}
private let storage: Storage
@JadenGeller
JadenGeller / WebView.swift
Created October 24, 2023 17:05
WKWebView in SwiftUI with intrinsic sizing based on the scrollWidth and scrollHeight of the page
import SwiftUI
import WebKit
struct WebView: NSViewRepresentable {
var url: URL
class Coordinator: NSObject, WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
if complete != nil {
@JadenGeller
JadenGeller / ScanSequence.swift
Created October 20, 2023 19:27
like scan from Haskell
struct ScanSequence<Base: Sequence, Result>: Sequence {
let base: Base
let first: Result
let next: (Result, Base.Element) -> Result
func makeIterator() -> PrependIterator<ScanIterator<Base.Iterator, Result>> {
.init(base: .init(base: base.makeIterator(), previous: first, combine: next), first: first)
}
}
import SwiftUI
import simd
struct Rotation3DEffect: GeometryEffect {
var angle: Angle
var axis: (x: CGFloat, y: CGFloat, z: CGFloat)
var anchor: UnitPoint = .center
var anchorZ: CGFloat = 0
var focalLength: CGFloat