matsuda
9/25/2016 - 2:46 PM

simplest Promise framework possible?

simplest Promise framework possible?

// Custom Promises
extension URLSession {
  func get(_ urlString: String) -> Promise<URLResponse> {
    return Promise({ (fulfill, reject) in
      guard let url = URL(string: urlString) else {
        reject()
        return
      }
      self.dataTask(with: url) { (body, response, error) in
        guard let response = response else {
          reject()
          return
        }
        fulfill(response)
        }.resume()
    })
  }
}
// USAGE: First load google.de then spiegel.de then amazon.de
let session = URLSession.shared

session.get("http://google.de").then { response in
    return session.get("http://spiegel.de")
}.then { response in
    return session.get("http://amazon.de")
}.then { response in
    // do nothing
}
public struct Promise<T> {
  typealias Fulfiller = (T) -> (Void)
  typealias Rejecter = (Void) -> (Void)
  typealias Resolver = (_ fulfill: @escaping Fulfiller, _ reject: @escaping Rejecter) -> (Void)
  let resolver: Resolver
  init(_ resolver: @escaping Resolver){
    self.resolver = resolver
  }
  func then<U>(_ execute: @escaping ((T) -> U)) -> Promise<U> {
    return Promise<U>({(fulfill, reject) in
      let onSuccess: ((T) -> (Void)) = { value in
        fulfill(execute(value)); return
      }
      let onError: ((Void) -> (Void)) = { print("error") }
      self.resolver(onSuccess, onError)
    })
  }
}