Skip to content

Instantly share code, notes, and snippets.

@gaeng2y
Forked from JCSooHwanCho/Combine+Cooldown.swift
Created November 14, 2023 05:24
Show Gist options
  • Save gaeng2y/ecda7b5dfd890f5aba86221b56c6d065 to your computer and use it in GitHub Desktop.
Save gaeng2y/ecda7b5dfd890f5aba86221b56c6d065 to your computer and use it in GitHub Desktop.
Combine operator that mimics RxSwift's throttle when latest: false
extension Publisher {
func coolDown<S: Scheduler>(for cooltime: S.SchedulerTimeType.Stride,
scheduler: S) -> some Publisher<Self.Output, Self.Failure> {
return self.receive(on: scheduler)
.scan((S.SchedulerTimeType?.none, Self.Output?.none)) {
let eventTime = scheduler.now
let minimumTolerance = scheduler.minimumTolerance
guard let lastSentTime = $0.0 else {
return (eventTime, $1)
}
let diff = lastSentTime.distance(to: eventTime)
guard diff >= (cooltime - minimumTolerance) else {
return (lastSentTime, nil)
}
return (eventTime, $1)
}
.compactMap { $0.1 }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment