32 lines
692 B
Swift
32 lines
692 B
Swift
import Combine
|
||
|
||
public extension Bus {
|
||
final class Debounce<Src, Dst> {
|
||
let v = PassthroughSubject<Src, Never>()
|
||
var subscriptions = [AnyCancellable]()
|
||
|
||
public init(
|
||
_ handler: @escaping ((Src) -> Dst?),
|
||
_ sec: Double,
|
||
_ src: String,
|
||
_ dst: String
|
||
) {
|
||
// Вход.
|
||
Bus.receiveSync(
|
||
[src],
|
||
{ [weak self] _, v in self?.v.send(v) },
|
||
&subscriptions
|
||
)
|
||
// Выход.
|
||
Bus.sendSync(
|
||
dst,
|
||
v
|
||
.debounce(for: .seconds(sec), scheduler: DispatchQueue.main)
|
||
.compactMap { (v: Src) in handler(v) }
|
||
.eraseToAnyPublisher(),
|
||
&subscriptions
|
||
)
|
||
}
|
||
}
|
||
}
|