Popularity
2.7
Growing
Activity
0.0
Stable
121
5
6

Code Quality Rank: L4
Programming language: Swift
License: MIT License
Tags: Events    
Latest version: v0.0.4

Future alternatives and similar libraries

Based on the "Events" category.
Alternatively, view Future alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of Future or a related project?

Add another 'Events' Library

README

Future

Language CocoaPods Carthage compatible License Issues

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


*Note that all licence references and agreements mentioned in the Future README section above are relevant to that project's source code only.