TM-SGNL-iOS/SignalServiceKit/PromiseKit/firstly.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

77 lines
1.8 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public func firstly<T: Thenable>(
on scheduler: Scheduler? = nil,
_ block: () throws -> T
) -> Promise<T.Value> {
let (promise, future) = Promise<T.Value>.pending()
do {
future.resolve(on: scheduler, with: try block())
} catch {
future.reject(error)
}
return promise
}
public func firstly<T>(
on scheduler: Scheduler? = nil,
_ block: () -> Guarantee<T>
) -> Guarantee<T> {
let (promise, future) = Guarantee<T>.pending()
future.resolve(on: scheduler, with: block())
return promise
}
public func firstly<T: Thenable>(
on scheduler: Scheduler,
_ block: @escaping () throws -> T
) -> Promise<T.Value> {
let (promise, future) = Promise<T.Value>.pending()
scheduler.asyncIfNecessary {
do {
future.resolve(on: scheduler, with: try block())
} catch {
future.reject(error)
}
}
return promise
}
public func firstly<T>(on scheduler: Scheduler, _ block: @escaping () -> Guarantee<T>) -> Guarantee<T> {
let (promise, future) = Guarantee<T>.pending()
scheduler.asyncIfNecessary {
future.resolve(on: scheduler, with: block())
}
return promise
}
public func firstly<T>(
on scheduler: Scheduler,
_ block: @escaping () throws -> T
) -> Promise<T> {
let (promise, future) = Promise<T>.pending()
scheduler.asyncIfNecessary {
do {
future.resolve(try block())
} catch {
future.reject(error)
}
}
return promise
}
public func firstly<T>(
on scheduler: Scheduler,
_ block: @escaping () -> T
) -> Guarantee<T> {
let (guarantee, future) = Guarantee<T>.pending()
scheduler.asyncIfNecessary {
future.resolve(block())
}
return guarantee
}