Skip to content

Instantly share code, notes, and snippets.

View rnapier's full-sized avatar

Rob Napier rnapier

View GitHub Profile
@rnapier
rnapier / gist:7515273
Created November 17, 2013 16:38
Exploration of thread priorities vs queue priorities
// Main thread priorty = 0.758065
NSLog(@"main:%@:%f", [NSThread currentThread], [NSThread threadPriority]);
// High priority = 0.532258
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"high:%@:%f", [NSThread currentThread], [NSThread threadPriority]);
// run forever! Note that other queues still happily process, even though our high-priority block never ends
while(1) {}
});
@rnapier
rnapier / TypeCoder.swift
Last active June 13, 2019 15:04
Decode based on a type field
import Foundation
/// Simple example of decoding different values based on a "type" field
let json = Data("""
[{
"type": "user",
"name": "Alice"
},
{
import Foundation
// Provides a nice bare-init for ID types
protocol IDType: Codable, Hashable {
associatedtype Value
var value: Value { get }
init(value: Value)
}
extension IDType {
// Fully type-erased solution for
// https://stackoverflow.com/questions/55549318/avoiding-type-erasure-when-implementing-the-repository-pattern/55550454
// I don't like type-erasers like this; I believe it can be sliced a better way.
// Compare https://gist.github.com/rnapier/f7f0fa6202b0d6586af188635f54b28b, which I like, but relies on a common
// currency of serializing everything to Data and working with that instead of having storage that can deals with Element
// directly.
// FURTHER THOUGHTS:
//
// This example is interesting because, like so many of these toy projects, its design is completely broken and wouldn't
import Foundation
protocol DataStorage {
subscript(identifier: String) -> Data? { get set }
}
extension UserDefaults: DataStorage {
subscript(identifier: String) -> Data? {
get { return data(forKey: identifier) }
set { set(newValue, forKey: identifier) }
@rnapier
rnapier / main.m
Last active April 5, 2019 17:44
GCD accessor
//
// main.m
// test
//
// Created by Rob Napier on 4/5/19.
//
#import <Foundation/Foundation.h>
@interface MyClass: NSObject

Item #: SCP-10791

Object Class: Safe

Special Containment Procedures: SCP-10791 must be maintained within the BMP (Basic Multilingual Plane) at all times. Removal from the BMP may cause disaggregation of the component parts, increasing nearby values by 2. While this is not considered a memetic hazard, the accounting department has made it clear that they will not accept non-standard operators wandering the halls since Incident ██/██/███ when [REDACTED].

Description: SCP-10791 is the result of unauthorized experimentation with SCP-889, SCP-1313, and three members of the Unicode Technical Committee. The less that is said about that, the better. What happens several miles north of ███████, Montana, USA....sometimes requires containment.

Since ██/██/2002, SCP-10791 has been contained in the ███████ Mathematical Operators block. Its name and appearance change regularly, though always an unlikely combination of symbols. Critic

package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"log"
"net"
"net/http"
@rnapier
rnapier / AnyRealmCollectionBox.swift
Created February 19, 2019 15:17
Boxing up AnyRealmCollection
// https://stackoverflow.com/questions/54764362/swift-array-of-tuples-with-generic-tuple-elements/54768030
struct AnyRealmCollectionBox<Element> {
public func index(after i: Int) -> Int { return i + 1 }
public func index(before i: Int) -> Int { return i - 1 }
private let _realm: () -> Realm?
public var realm: Realm? { return _realm() }
private let _isInvalidated: () -> Bool
@rnapier
rnapier / snakecase.swift
Created February 14, 2019 21:06
Custom key decoding strategy
import Foundation
let json = Data("""
{
"user_name":"Mark",
"user_info":{
"b_a1234":"value_1",
"c_d5678":"value_2"
}
}