Skip to content

nghialv/Future

Repository files navigation

Future

LanguageCocoaPods [Carthage compatible] (https://github.com/Carthage/Carthage) LicenseIssues

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 iniflet repo = repo {requestUser(repo.ownerId){ user, error iniflet user = user { // do something }else{ // error handling }}}else{ // error handling }}
Code with Future
letfuture=requestRepository(12345).map{ $0.ownerId }.flatMap(requestUser) future.onCompleted{ result inswitch result {case.Success(let user):println(user)case.Failure(let error):println(error)}}

Shorthand by using operator

letfuture=requestRepository(12345)<^>{ $0.ownerId }>>- requestUser future.onCompleted{ result inswitch result {case.Success(let user):println(user)case.Failure(let error):println(error)}}

Usage

  • map<^>
letf=requestUser("nghialv")<^>{ $0.id } f.onSuccess{ userId inprintln(userId)}
  • flatMap>>-
letf=searchRepositories("Hakuba")<^>{ $0.first!.ownerName }>>- requestUser f.onComplete{ result inswitch result {case.Success(let user):println(user)case.Failure(let error):println(error)}}
  • filter
lete=NSError(domain:"noSuchElement", code:1, userInfo:nil)letf1=searchRepositories("Hakuba")letf= f1.filter(e){ $0.count >0}<^>{ $0.first!.ownerName }>>- requestUser f.onComplete{ result inswitch result {case.Success(let user):println(user)case.Failure(let error):println(error)}}
  • andThen
// side-effect varreposCount=0letf1=searchRepositories("Hakuba")letf2= f1.andThen{ result inswitch result {case.Success(let repos): reposCount = repos.value.count case.Failure(let error):break}}letf3= f2 <^>{ $0.first!.ownerName }>>- requestUser f3.onComplete{ result inswitch result {case.Success(let user):println(user)case.Failure(let error):println(error)}}
  • recover

  • zip

letf1=searchRepositories("Future")letf2=requestUser("nghialv")letf3= f1.zip(f2) f3.onSuccess{ repos, user inprintln(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

About

Swift µframework providing Future<T, Error>

Resources

License

Stars

Watchers

Forks

Packages

No packages published