Skip to content

Instantly share code, notes, and snippets.

@adam-zethraeus
adam-zethraeus / AnySubject.swift
Last active January 1, 2022 20:57
AnySubject — Type Erasure for Combine's Subject protocol / CurrentValueSubject / PassthroughSubject
import Combine
import Foundation
public final class AnySubject<Output, Failure: Error>: Subject {
public typealias Output = Output
private let valueFunc: (Output) -> ()
private let completionFunc: (Subscribers.Completion<Failure>) -> ()
private let subscriptionFunc: (Subscription) -> ()
@adam-zethraeus
adam-zethraeus / If.swift
Created January 8, 2022 22:43
(Flat)Mappable Boolean
import Foundation
public struct If {
let ifTrue: Optional<Void>
public init(_ condition: @autoclosure () -> Bool) {
self.ifTrue = condition() ? .some(()) : .none
}
public func map<T>(_ transform: () -> T) -> T? {
@adam-zethraeus
adam-zethraeus / vpn.sh
Last active January 8, 2022 22:46 — forked from skrajewski/README.md
A cli for launching/stopping Global Protect (and stopping it from auto-launching on restart)
#!/bin/bash
function setup() {
sudo mv /Library/LaunchDaemons/com.paloaltonetworks.gp.pangpsd.plist /Library/Application\ Support/PaloAltoNetworks/GlobalProtect/
sudo mv /Library/LaunchAgents/com.paloaltonetworks.gp.pangps.plist /Library/Application\ Support/PaloAltoNetworks/GlobalProtect/
sudo mv /Library/LaunchAgents/com.paloaltonetworks.gp.pangpa.plist /Library/Application\ Support/PaloAltoNetworks/GlobalProtect/
}
function up() {
@adam-zethraeus
adam-zethraeus / GetOrSet.swift
Created January 10, 2022 03:50
'GetOrSet' accessors for optionals and dictionaries
import Foundation
public extension Optional {
mutating func getOrSet(builder: () -> Wrapped) -> Wrapped {
switch self {
case .some(let wrapped):
return wrapped
case .none:
let value = builder()
self = .some(value)
@adam-zethraeus
adam-zethraeus / UIResponderPublisherSwizzle.swift
Last active January 10, 2022 03:50
UIResponderPublisher
import Combine
import UIKit
extension UIResponder {
static let firstResponderPublisherSwizzle: Void = {
guard let originalMethod = class_getInstanceMethod(UIResponder.self, #selector(becomeFirstResponder)),
let swizzledMethod = class_getInstanceMethod(UIResponder.self, #selector(swizzled_becomeFirstResponder))
else { return }
method_exchangeImplementations(originalMethod, swizzledMethod)
}()
@adam-zethraeus
adam-zethraeus / unln.sh
Last active February 17, 2022 22:34
cd into un-symlinked path for current directory
#!/bin/bash
function unln {
eval 'cd "$(pwd -P)"'
}
@adam-zethraeus
adam-zethraeus / zoxide_subdir.zsh
Last active February 17, 2022 22:39
zoxide: cd into matching subdirectory
#!/bin/zsh
function zoxide_print_subdir {
echo "$(zoxide query "$(pwd)" "$@")"
}
function zoxide_subdir {
eval 'cd "$(zoxide_print_subdir "$@")"'
}
@adam-zethraeus
adam-zethraeus / yynn.zsh
Last active February 17, 2022 22:42
A circular buffer of saved directories to cd to in turn. (persisted)
#!/bin/zsh
yynn=()
function pp {
_yyload
echo -e ${(j. \033[0;31m≪\033[0m .)yynn}
}
function _yysave {
@adam-zethraeus
adam-zethraeus / TypeErasure.stencil
Created April 1, 2022 22:28
Swift Sorcery Type Erasure
{% for type in types.protocols %}
/// A type-erased instance of ``{{type.name}}``
{{type.accessLevel}} struct Any{{ type.name }}: {{ type.name }} {
{% for var in type.allVariables %}
private let {{var.name}}Var: () -> {{var.typeName}}
{% endfor %}
{% for method in type.allMethods %}
private let {{ method.callName }}Func: ({% for param in method.parameters%}{{param.typeName}}{% if not forloop.last%}, {% endif %}{% endfor %}) -> {{ method.returnTypeName }}
@adam-zethraeus
adam-zethraeus / PropertyMockable.swift
Last active July 3, 2022 00:19
Mockable wrapper exposing swappable properties. Can't work for methods because keypaths don't support them.
@dynamicMemberLookup
public struct Mockable<T> {
public enum MockField<T> {
case property(PartialKeyPath<T>, Any)
}
enum Wrapped {
case value(T)
case mock([MockField<T>])