Skip to content

Instantly share code, notes, and snippets.

@ukitaka
ukitaka / Override.swift
Last active January 6, 2017 06:12
Override same var name
protocol BodyParameters { }
struct JSONBodyParameters: BodyParameters { }
struct MultipartFormDataBodyParameters: BodyParameters { }
protocol Request {
var bodyParameters: BodyParameters? { get }
}
extension Request {
var bodyParameters: BodyParameters? {
@ukitaka
ukitaka / Contravariant.swift
Last active December 21, 2016 08:42
Contravariant?
typealias Contravariant<A> = (A) -> ()
class Hoge { }
class Fuga: Hoge { }
let fuga: Fuga = Fuga()
let hoge: Hoge = Hoge()
let fugaC: Contravariant<Fuga> = { _ in }
let hogeC: Contravariant<Hoge> = { _ in }
struct Prism<S, A> {
private let getOption: (S) -> A?
private let reverseGet: (A) -> S
init(getOption: @escaping (S) -> A?, reverseGet: @escaping (A) -> S) {
self.getOption = getOption
self.reverseGet = reverseGet
}
}
@ukitaka
ukitaka / Lens.swift
Last active December 18, 2016 06:15
Lens
struct Lens<S, A> {
typealias Getter = (S) -> A
typealias Setter = (S, A) -> S
fileprivate let _get: Getter
fileprivate let _set: Setter
init(get: @escaping Getter, set: @escaping Setter) {
self._get = get
self._set = set
@ukitaka
ukitaka / TODO.swift
Created December 13, 2016 09:30
TODO
public final class _TO {
lazy var DO: Never = { fatalError() }()
}
public let TO = _TO()
@ukitaka
ukitaka / fatalErrorT.swift
Created December 13, 2016 09:13
fatalErrorT
func fatalErrorT<T>() -> T {
fatalError()
}
func fatalErrorT<T>(_ message: String) -> T {
fatalError(message)
}
@ukitaka
ukitaka / Impure.swift
Created December 12, 2016 06:30
置換モデルでthrowsが純粋じゃないことを示す例
enum Error: Swift.Error {
case castError
}
func toInt(_ string: String) throws -> Int {
guard let i = Int(string) else {
throw Error.castError
}
return i
}
@ukitaka
ukitaka / Either.swift
Created December 9, 2016 07:21
Scala 2.11までのEitherっぽいEither(right-biasedでないEither)
enum Either<L, R> {
case left(L)
case right(R)
}
extension Either {
var rightProjection: RightProjection<L, R> {
return RightProjection(either: self)
}
@ukitaka
ukitaka / HList.swift
Last active December 18, 2016 06:49
HList
protocol HList {
associatedtype Head
associatedtype Tail
}
struct HCons<H, T: HList>: HList {
typealias Head = H
typealias Tail = T
let head: H
@ukitaka
ukitaka / map2.swift
Created December 6, 2016 10:26
Swiftのパターンマッチも意外とできた(できないと思ってた)
func map2<A, B, C>(_ fa: Optional<A>, _ fb: Optional<B>, _ f: (A, B) -> C) -> Optional<C> {
switch (fa, fb) {
case (.some(let a), .some(let b)): // ここできると思わなかった...
return .some(f(a, b))
default:
return .none
}
}