Skip to content

Instantly share code, notes, and snippets.

@mayoff
mayoff / TEA.swift
Last active Apr 9, 2020
An implementation of Point-Free's Composable Architecture, with the addition of subscriptions from The Elm Architecture (TEA). See https://github.com/pointfreeco/episode-code-samples/issues/51
View TEA.swift
#if canImport(Combine)
import Combine
import CasePaths
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public typealias Effect<Output> = AnyPublisher<Output, Never>
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
extension Effect {
@mayoff
mayoff / ContentView.swift
Created Feb 26, 2020
SwiftUI gradients spanning multiple views
View ContentView.swift
import SwiftUI
struct BubbleFramesValue {
var framesForKey: [AnyHashable: [CGRect]] = [:]
var gradientFrame: CGRect? = nil
}
struct BubbleFramesKey { }
extension BubbleFramesKey: PreferenceKey {
View gist:bcb5fc06b79f8b0a0270ebf48e38d4a1
# Show the Xcode version number over the Dock icon.
defaults write com.apple.dt.Xcode DVTEnableDockIconVersionNumber -bool YES
# Or set ShowDVTDebugMenu.
# Show Index in the Report navigator.
# https://pspdfkit.com/blog/2019/how-xcode-indexing-works-and-how-to-solve-problems/
defaults write com.apple.dt.Xcode IDEIndexShowLog -bool YES
@mayoff
mayoff / ConversationView.swift
Created Feb 14, 2020
playground demonstrating SwiftUI PreferenceKey, EnvironmentKey, and GeometryReader
View ConversationView.swift
import SwiftUI
import PlaygroundSupport
struct EqualWidthKey: PreferenceKey {
static var defaultValue: CGFloat? { nil }
static func reduce(value: inout CGFloat?, nextValue: () -> CGFloat?) {
switch (value, nextValue()) {
case (_, nil): break
case (nil, let next): value = next
@mayoff
mayoff / SteppingSubscriber.swift
Created Dec 18, 2019
Custom Combine operator for stepping a publisher's signals through function
View SteppingSubscriber.swift
// See https://stackoverflow.com/q/59367202/77567
import Combine
import Foundation
extension Publisher {
func step(with stepper: @escaping (SteppingSubscriber<Output, Failure>.Event) -> ()) -> AnyCancellable {
let subscriber = SteppingSubscriber<Output, Failure>(stepper: stepper)
self.subscribe(subscriber)
return .init(subscriber)
@mayoff
mayoff / decode-dyn-uti.swift
Created Mar 14, 2019
Swift command-line script to decode dynamic UTIs
View decode-dyn-uti.swift
#!/usr/bin/xcrun swift
// http://alastairs-place.net/blog/2012/06/06/utis-are-better-than-you-think-and-heres-why/
extension String {
static let bitsForCodeUnit: [Character: [UInt8]] = {
var dict = [Character: [UInt8]]()
for (i, ch) in "abcdefghkmnpqrstuvwxyz0123456789".enumerated() {
let bits = Array((0 ..< 5).map({ UInt8((i >> $0) & 1) }).reversed())
dict[ch] = bits
@mayoff
mayoff / unowned-safety-dance.swift
Created Feb 23, 2019
test Swift unowned safety
View unowned-safety-dance.swift
class MyObject { }
var o = MyObject()
print("strong o = \(o)")
unowned let u = o
print("unowned u = \(u)")
o = MyObject()
@mayoff
mayoff / main.m
Created Feb 11, 2019
Set pHYs chunk (DPI) of PNG
View main.m
@import AppKit;
@import ImageIO;
@import CoreServices;
#define fromCF (__bridge id)
#define toCF (__bridge CFTypeRef)
int main(int argc, const char * argv[]) {
@autoreleasepool {
CGRect rect = CGRectMake(0, 0, 100, 100);
@mayoff
mayoff / wedges-with-gaps.swift
Created Dec 27, 2018
Simon game wedges in iOS
View wedges-with-gaps.swift
import UIKit
import PlaygroundSupport
typealias Radians = CGFloat
extension UIBezierPath {
static func simonWedge(innerRadius: CGFloat, outerRadius: CGFloat, centerAngle: Radians, gap: CGFloat) -> UIBezierPath {
let innerAngle: Radians = CGFloat.pi / 4 - gap / (2 * innerRadius)
let outerAngle: Radians = CGFloat.pi / 4 - gap / (2 * outerRadius)
@mayoff
mayoff / Decimal.py
Created Oct 10, 2018
Decimal / NSDecimal support for lldb
View Decimal.py
# Decimal / NSDecimal support for lldb
#
# Put this file somewhere, e.g. ~/.../lldb/Decimal.py
# Then add this line to ~/.lldbinit:
# command script import ~/.../lldb/Decimal.py
import lldb
def stringForDecimal(sbValue, internal_dict):
from decimal import Decimal, getcontext
You can’t perform that action at this time.