Skip to content

Instantly share code, notes, and snippets.

Avatar

Rob Napier rnapier

View GitHub Profile
@rnapier
rnapier / retain.swift
Last active Jul 3, 2018
Laundering retain loops
View retain.swift
// With functions/methods you can "launder" your code so it doesn't require self references anymore,
// but you wind up with retain loops that are very non-obvious. I'm having trouble finding good coding
// styles that reliably avoid this kind of problem.
class B {
// A retain loop waiting to happen
var completionHandler: () -> Void = {}
}
class C {
@rnapier
rnapier / stream.swift
Last active Jun 3, 2021
Newer stream-based ideas on observables
View stream.swift
/*
Updated ideas on observation. Much more powerful and composeable than previous Observable approach.
Simpler, but less powerful, than RxSwift
*/
import Foundation
public class Disposable {
private var isDisposed = false
private let _dispose: () -> Void
View mapExceptLast.swift
let xs = [0,1,2,3,4,5]
let double: (Int) -> Int = { $0 * 2 }
let isEven: (Int) -> Bool = { $0 % 2 == 0 }
// Goal: [0,2,4,6,4,10]. Double all but the last even element.
// This impl makes me sad. Lots of state and copies the entire collection twice (once during transforming, and once to unreverse)
extension Collection {
@rnapier
rnapier / observable.swift
Created May 16, 2018
New Observable idea
View observable.swift
import Foundation
class Disposable {
let dispose: () -> Void
init(dispose: @escaping () -> Void) { self.dispose = dispose }
deinit {
dispose()
}
}
@rnapier
rnapier / main.swift
Created Mar 30, 2018
vvsqrtf performance tests
View main.swift
// swift -O main.swift
import Foundation
import Accelerate
let N = 100_000_000
let x = (0...N).map { _ in Float(drand48() * 1_000_000) }
func test(_ f: () -> [Float], name: String) {
@rnapier
rnapier / ClassSet.swift
Last active Feb 3, 2018
SetAlgebra for classes
View ClassSet.swift
//
// ClassSet.swift
// audio
//
// Created by Rob Napier on 1/25/18.
// Copyright © 2018 Jaybird LLC. All rights reserved.
//
/// Unordered set of unique class objects. Does not require Equatable or Hashable.
struct ClassSet<Element> where Element: AnyObject {
@rnapier
rnapier / json.swift
Last active Oct 7, 2021
Generic JSON Decodable
View json.swift
import Foundation
@dynamicMemberLookup
enum JSON: Codable, CustomStringConvertible {
var description: String {
switch self {
case .string(let string): return "\"\(string)\""
case .number(let double):
if let int = Int(exactly: double) {
return "\(int)"
@rnapier
rnapier / error-propagation.swift
Last active Apr 27, 2017 — forked from nicklockwood/error-propagation.swift
Typed error use-case example
View error-propagation.swift
// I know you meant it to be exaggerated, but I still think this is the better approach in practice:
enum ClassError: Error {
case propertyNotFound(name: String)
case typeMismatch(propertyName: String)
}
class Foo {
var properties: [(String, Any)] = []
private func validateValue(_ value: Any, for property: String) throws { // Note that I pass the name just for the error; that's ok IMO
View JSONInit.swift
public typealias JSON = [String:Any]
public enum JSONInitializableError: Error {
case initializationError(key: String)
}
public protocol JSONInitializable {
associatedtype Key: RawRepresentable
init(with json: JSON) throws
}
@rnapier
rnapier / doOnce.swift
Last active May 10, 2021
A function that only executes once. Good Swift or over-clever?
View doOnce.swift
// Swift3 gets rid of dispatch_once and recommends replacing it with a lazy global.
// That's very straightforward when dispach_once is used to initialize something, but
// isn't an exact match when you want something to execute once, and then become a noop
// in a thread-safe way.
// The following approach seems completely "correct" and I guess actually a bit elegant,
// if by "elegant" you mean "terse and not immediately obvious to the reader, which makes
// you look very clever."
var doOnce: () -> Void = {