Skip to content

Instantly share code, notes, and snippets.

View quintonpryce's full-sized avatar

Quinton Pryce quintonpryce

  • TextNow
  • Guelph
View GitHub Profile
@quintonpryce
quintonpryce / IntentPersonProvider.swift
Created November 2, 2020 16:38
Retrieving a contact's phone number from a name in an INPerson object
import Contacts
import Intents
protocol ContactStoring {
func enumerateContacts(with fetchRequest: CNContactFetchRequest, usingBlock block: @escaping (CNContact, UnsafeMutablePointer<ObjCBool>) -> Void) throws
}
extension CNContactStore: ContactStoring {}
class IntentPersonProvider {
@quintonpryce
quintonpryce / IntentHandler.swift
Last active August 11, 2023 09:31
IntentHandler for INStartCallHandling
import Contacts
import Intents
class IntentHandler: INExtension, INStartCallIntentHandling {
/// CNContactsStore implementation to get a person from contacts.
///
/// See https://gist.github.com/quintonpryce/d69499bf40bdef208bd35d00aba188db
lazy var personProvider = IntentPersonProvider()
@available(iOSApplicationExtension 13.0, *)
@quintonpryce
quintonpryce / Levenshtein.swift
Created December 31, 2019 15:58 — forked from RuiNelson/Levenshtein.swift
Levenshtein distance between two String for Swift 4.x
import Foundation
extension String {
subscript(index: Int) -> Character {
return self[self.index(self.startIndex, offsetBy: index)]
}
}
extension String {
public func levenshtein(_ other: String) -> Int {
@quintonpryce
quintonpryce / AnalyticsCore.swift
Last active July 18, 2019 19:26
Analytics Core
open class Analytics: AnalyticsScope {
public static let shared: AnalyticsScope = Analytics()
private var eventTrackers: [EventTrackerKey: EventTracker] = [:]
private let failureHandler: FailureHandler
public init() {
failureHandler = SimpleFailureHandler()
}
@quintonpryce
quintonpryce / AnalyticsScope.swift
Created July 18, 2019 19:25
Analytics Core Contract
public protocol AnalyticsScope {
func track(event: AnalyticsEvent)
func track<T: AnalyticsParameter>(event: AnalyticsEvent, with parameters: T)
func addEventTracker(key: EventTrackerKey, tracker: EventTracker)
}
private func trackAnalytic<T: AnalyticsParameter>(event: AnalyticsEvent, parameters: T?) {
if event.supportedTrackers.isEmpty {
failureHandler.failure("Event \(event.name) does not have any supported EventTrackers.")
return
}
for trackerKey in event.supportedTrackers {
if let eventTracker = eventTrackers[trackerKey] {
if eventTracker.isEventNameSupported(event: event.name) {
if let parameters = parameters, !parameters.isEmpty() {
private func trackAnalytic<T: AnalyticsParameter>(event: AnalyticsEvent, parameters: T?) {
if event.supportedTrackers.isEmpty {
failureHandler.failure("Event \(event.name) does not have any supported EventTrackers.")
return
}
for trackerKey in event.supportedTrackers {
if let eventTracker = eventTrackers[trackerKey] {
if let parameters = parameters, !parameters.isEmpty() {
eventTracker.track(event: event.name, with: parameters)
private let failureHandler: FailureHandler
public init() {
failureHandler = SimpleFailureHandler()
}
public init(failureHandler: FailureHandler) {
self.failureHandler = failureHandler
}
public protocol FailureHandler {
func failure(_ message: String)
}
class SimpleFailureHandler: FailureHandler {
func failure(_ message: String) {
assertionFailure(message)
}
}
@quintonpryce
quintonpryce / EmptyParameter.swift
Last active July 18, 2019 19:20
Empty Parameter
class EmptyParameter: AnalyticsParameter {
var parameter: Bool?
typealias ParameterType = Bool?
init() {
parameter = nil
}
}