Future
[] (https://github.com/Carthage/Carthage)
Swift µframework providing Future<T, Error>.
This library is inspired by the talk of Javier Soto at SwiftSubmit2015 and the Future
implementation in Scala.
And this is using antitypical/Result
.
Why we need Future?
Traditional async code
func requestRepository(repoId: Int64, completion: (Repository?, NSError?) -> Void) {}
func requestUser(userId: Int64, completion: (User?, NSError?) -> Void) {}
// get owner info of a given repository
requestRepository(12345) { repo, error in
if let repo = repo {
requestUser(repo.ownerId) { user, error in
if let user = user {
// do something
} else {
// error handling
}
}
} else {
// error handling
}
}
Code with Future
let future = requestRepository(12345)
.map { $0.ownerId }
.flatMap(requestUser)
future.onCompleted { result in
switch result {
case .Success(let user): println(user)
case .Failure(let error): println(error)
}
}
Shorthand by using operator
let future = requestRepository(12345) <^> { $0.ownerId } >>- requestUser
future.onCompleted { result in
switch result {
case .Success(let user): println(user)
case .Failure(let error): println(error)
}
}
Usage
map
<^>
let f = requestUser("nghialv") <^> { $0.id }
f.onSuccess { userId in
println(userId)
}
flatMap
>>-
let f = searchRepositories("Hakuba") <^> { $0.first!.ownerName } >>- requestUser
f.onComplete { result in
switch result {
case .Success(let user): println(user)
case .Failure(let error): println(error)
}
}
filter
let e = NSError(domain: "noSuchElement", code: 1, userInfo: nil)
let f1 = searchRepositories("Hakuba")
let f = f1.filter(e){ $0.count > 0 } <^> { $0.first!.ownerName } >>- requestUser
f.onComplete { result in
switch result {
case .Success(let user): println(user)
case .Failure(let error): println(error)
}
}
andThen
// side-effect
var reposCount = 0
let f1 = searchRepositories("Hakuba")
let f2 = f1.andThen { result in
switch result {
case .Success(let repos): reposCount = repos.value.count
case .Failure(let error): break
}
}
let f3 = f2 <^> { $0.first!.ownerName } >>- requestUser
f3.onComplete { result in
switch result {
case .Success(let user): println(user)
case .Failure(let error): println(error)
}
}
-
recover
-
zip
let f1 = searchRepositories("Future")
let f2 = requestUser("nghialv")
let f3 = f1.zip(f2)
f3.onSuccess { repos, user in
println(repos)
println(user)
}
flatten
Installation
- Using Carthage
- Insert
github "nghialv/Future"
to your Cartfile- Run
carthage update
- Using Cocoapods
- Insert
use_frameworks!
to your Podfile- Insert
pod "Future"
to your Podfile- Run
pod install
- Using Submodule
Requirements
- Swift 1.2 (Xcode 6.3 or later)
- iOS 8.0 or later