Skip to content

Instantly share code, notes, and snippets.

@ukitaka
Created November 12, 2016 06:33
Show Gist options
  • Save ukitaka/6a25e5c6984d0278c2db0761f2095991 to your computer and use it in GitHub Desktop.
Save ukitaka/6a25e5c6984d0278c2db0761f2095991 to your computer and use it in GitHub Desktop.
TailRec.swift
class TailRec<A> {
fileprivate init() { }
func flatMap<B>(_ f: @escaping (A) -> TailRec<B>) -> TailRec<B> {
return FlatMap(self, f)
}
func map<B>(_ f: @escaping (A) -> B) -> TailRec<B> {
return flatMap { a in Return(f(a)) }
}
}
final class Return<A>: TailRec<A> {
let a: A
init(_ a: A) {
self.a = a
super.init()
}
}
final class Suspend<A>: TailRec<A> {
let resume: () -> A
init(resume: @escaping () -> A) {
self.resume = resume
super.init()
}
}
final class FlatMap<A, B>: TailRec<B> {
let sub: TailRec<A>
let k: (A) -> TailRec<B>
init(_ sub: TailRec<A>, _ k: @escaping (A) -> TailRec<B>) {
self.sub = sub
self.k = k
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment