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