Skip to content

Instantly share code, notes, and snippets.

Avatar

Olivier Halligon AliSoftware

View GitHub Profile
@AliSoftware
AliSoftware / pod_stats.rb
Last active Mar 12, 2021
Tools to investigate the state of our internal pods at a8c
View pod_stats.rb
#!/usr/bin/env ruby
require 'json'
require 'yaml'
require 'open-uri'
# [Array<String>] List of iOS/macOS apps
app_dirs = ['WordPress-iOS', 'woocommerce-ios', 'simplenote-ios', 'simplenote-macos', 'autoproxxy']
specs_cache = File.join(__dir__, 'pod_stats.cache')
@AliSoftware
AliSoftware / git-groom
Last active Mar 26, 2021
Sync git working copies' trunk and develop branches and prune local and remote deleted/orphan branches
View git-groom
#!/bin/bash -euo pipefail
#
# Author: O.Halligon
# Jan 2021
#
# Help
if [ "${1:-}" == "-h" -o "${1:-}" == "--help" ]; then
BASENAME=${0##*/}
@AliSoftware
AliSoftware / RegEx.swift
Created Mar 16, 2020
Attempt at a nicer API for Swift RegEx (WIP)
View RegEx.swift
// Simple wrapper around NSRegularExpression to provide a swiftier API and, ability to have matches exposing Range instead of NSRange
import Foundation
struct RegEx<Names> {
let regex: NSRegularExpression
init(pattern: String, options: NSRegularExpression.Options = []) throws {
self.regex = try NSRegularExpression(pattern: pattern, options: options)
}
View 1. Demo.swift
//: ## Demo
struct User: CustomStringConvertible {
let name: String
let age: Int
var description: String { "\(name) (\(age))" }
}
let users = [
User(name: "Bob", age: 22),
@AliSoftware
AliSoftware / Demo.swift
Last active Apr 10, 2021
NestableCodingKey: Nice way to define nested coding keys for properties
View Demo.swift
struct Contact: Decodable, CustomStringConvertible {
var id: String
@NestedKey
var firstname: String
@NestedKey
var lastname: String
@NestedKey
var address: String
enum CodingKeys: String, NestableCodingKey {
@AliSoftware
AliSoftware / CustomMatcher.swift
Last active Jan 5, 2020
Add custom pattern matching to make your switch statements magical
View CustomMatcher.swift
struct CustomMatcher<Value> {
let closure: (Value) -> Bool
static func ~= (caseValue: CustomMatcher<Value>, switchValue: Value) -> Bool {
caseValue.closure(switchValue)
}
static func ~= (caseValue: Value, switchValue: CustomMatcher<Value>) -> Bool {
switchValue.closure(caseValue)
}
}
View CustomCodable+PropertyWrapper.swift
import Foundation
protocol TransformerType {
associatedtype BaseType
associatedtype TypeForCoding: Codable
static var encodeTransform: (BaseType) throws -> TypeForCoding { get }
static var decodeTransform: (TypeForCoding) throws -> BaseType { get }
}
@propertyWrapper
@AliSoftware
AliSoftware / RegEx.swift
Created Jul 31, 2019
Simple wrapper around NSRegularExpression to provide a swiftier API and, ability to have matches exposing Range instead of NSRange
View RegEx.swift
// Simple wrapper around NSRegularExpression to provide a swiftier API and, ability to have matches exposing Range instead of NSRange
import Foundation
struct RegEx {
let regex: NSRegularExpression
init(pattern: String, options: NSRegularExpression.Options = []) throws {
self.regex = try NSRegularExpression(pattern: pattern, options: options)
}
View Clamped+PropertyWrapper.swift
// Xcode 11b1
@propertyDelegate
struct Clamped<Value: Comparable> {
private var storage: Value
private var clamp: (Value) -> Value
init(min: Value, max: Value, initialValue: Value) {
let clampingFunction = { ($0...$0).clamped(to: min...max).lowerBound }
self.storage = clampingFunction(initialValue)
View Enum-Values-v1.swift
enum Demo {
case simple
case oneValue(Int)
case twoValues(String, Double)
case threeValues(one: Int, two: Float, [Int])
}
//: # Direct exposition in the enum
//: ## Sourcery Template