在 Swift Combine 中制作自定义延迟未来发布者?

Making custom Deffered Future Publisher in Swift Combine?

就像标题所说的那样,我想制作一个基本上可以像延迟未来一样运行的自定义发布者。通常当我想在一些 Future 中封装代码,但希望它在订阅时执行,我需要写这样的东西:

Deffered {
    Future { promise in
    }
}

现在我正在考虑制作自定义发布者,类似于 DefferedFuture 的东西,它具有与 Future 完全相同的功能,但只会在订阅时执行承诺?

最明显的答案是:

func single<Output, Failure>(_ promise: @escaping (@escaping (Result<Output, Failure>) -> Void) -> Void) -> Deferred<Future<Output, Failure>> where Failure: Error {
    Deferred {
        Future<Output, Failure>(promise)
    }
}

如果它绝对必须是类型而不是函数,那么:

extension Publishers {
    struct Single<Output, Failure>: Publisher where Failure: Error {
        let promise: (@escaping (Result<Output, Failure>) -> Void) -> Void
        
        func receive<S>(subscriber: S) where S: Subscriber, Failure == S.Failure, Output == S.Input {
            Deferred { Future(promise) }
            .subscribe(subscriber)
        }
    }
}