Skip to content

Instantly share code, notes, and snippets.

View tonyarnold's full-sized avatar

Tony Arnold tonyarnold

View GitHub Profile
// swift-tools-version: 6.1
import PackageDescription
let package = Package(
name: "SwiftFormatPlugin",
products: [
.plugin(name: "SwiftFormatPlugin", targets: ["SwiftFormatPlugin"])
],
targets: [
.plugin(name: "SwiftFormatPlugin", capability: .buildTool)
enum AsyncError: Error {
case finishedWithoutValue
}
extension AnyPublisher {
func async() async throws -> Output {
try await withCheckedThrowingContinuation { continuation in
var cancellable: AnyCancellable?
var finishedWithoutValue = true
cancellable = first()
import SwiftUI
public struct ChangeObserver<V: Equatable>: ViewModifier {
public init(newValue: V, action: @escaping (V) -> Void) {
self.newValue = newValue
self.newAction = action
}
private typealias Action = (V) -> Void
@tonyarnold
tonyarnold / Sequence+AnyCancellable.swift
Last active September 17, 2020 02:24
Useful extension for storing a sequence of AnyCancellable instances
import Combine
import Combine
extension Sequence where Element == AnyCancellable {
/// Stores this type-erasing cancellable collection in the specified collection.
///
/// - Parameter collection: The collection in which to store this ``AnyCancellable`` sequence.
func store<C>(in collection: inout C) where C: RangeReplaceableCollection, C.Element == Element {
forEach { $0.store(in: &collection) }
@tonyarnold
tonyarnold / NSObject+BidirectionalAssign.swift
Created September 11, 2020 05:52
Experiment to implement bidirectional assignment of values using Combine/KVO publishers
import Combine
import Foundation
extension NSObjectProtocol where Self: NSObject {
/// Assigns each unique element assigned to the key paths specified to the inverse object.
func bidirectionallyAssign<Value: Equatable, B: NSObject>(
from firstKeyPath: ReferenceWritableKeyPath<Self, Value>,
to secondKeyPath: ReferenceWritableKeyPath<B, Value>,
on otherObject: B
) -> [AnyCancellable] {
@tonyarnold
tonyarnold / NSObject+AnyCancellable.swift
Created September 11, 2020 04:34
A nifty extension that I borrowed from DeclarativeHub's ReactiveKit: https://github.com/declarativehub/reactivekit/
import Combine
import ObjectiveC.runtime
extension NSObject {
private enum AssociatedKeys {
static var CancellablesKey = "CancellablesKey"
}
/// A set that can be used to dispose of Combine cancellables.
public var cancellables: Set<AnyCancellable> {
@tonyarnold
tonyarnold / RangeReplaceableCollectionOperators.swift
Created August 25, 2020 13:29
Use this to add an operator to append items to sequences, ie: `collection += item`
extension RangeReplaceableCollection {
static func += (collection: inout Self, element: Element) {
collection.append(element)
}
static func += (collection: inout Self, element: Element?) {
if let element = element {
collection.append(element)
}
}
import Vapor
extension EventLoopFuture {
/// When the current `EventLoopFuture<Value>` is fulfilled, run the provided callback,
/// which will provide a new `EventLoopFuture`.
///
/// This allows you to dynamically dispatch new asynchronous tasks as phases in a
/// longer series of processing steps. Note that you can use the results of the
/// current `EventLoopFuture<Value>` when determining how to dispatch the next operation.
///
import Foundation
@propertyWrapper
struct StringCoded<WrappedValue: LosslessStringConvertible>: Codable {
var wrappedValue: WrappedValue
init(wrappedValue: WrappedValue) {
self.wrappedValue = wrappedValue
}
@tonyarnold
tonyarnold / CompareTools.plist
Created March 6, 2019 22:35
Git Tower & Sublime Merge Integration
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>ApplicationIdentifier</key>
<string>com.sublimemerge</string>
<key>ApplicationName</key>
<string>Sublime Merge</string>
<key>DisplayName</key>