mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
47 lines
1.3 KiB
Swift
47 lines
1.3 KiB
Swift
import Foundation
|
|
import UIKit
|
|
import SwiftSignalKit
|
|
|
|
final class ThrottledValue<T: Equatable> {
|
|
private var value: T
|
|
private let interval: Double
|
|
private var previousSetTimestamp: Double
|
|
private let valuePromise: ValuePromise<T>
|
|
private var timer: SwiftSignalKit.Timer?
|
|
|
|
init(value: T, interval: Double) {
|
|
self.value = value
|
|
self.interval = interval
|
|
self.previousSetTimestamp = CACurrentMediaTime()
|
|
self.valuePromise = ValuePromise(value)
|
|
}
|
|
|
|
deinit {
|
|
self.timer?.invalidate()
|
|
}
|
|
|
|
func set(value: T) {
|
|
guard self.value != value else {
|
|
return
|
|
}
|
|
let timestamp = CACurrentMediaTime()
|
|
if timestamp > self.previousSetTimestamp + self.interval {
|
|
self.previousSetTimestamp = timestamp
|
|
self.valuePromise.set(value)
|
|
} else {
|
|
self.timer?.invalidate()
|
|
let timer = SwiftSignalKit.Timer(timeout: self.interval, repeat: false, completion: { [weak self] in
|
|
if let strongSelf = self {
|
|
strongSelf.valuePromise.set(strongSelf.value)
|
|
}
|
|
}, queue: Queue.mainQueue())
|
|
self.timer = timer
|
|
timer.start()
|
|
}
|
|
}
|
|
|
|
func get() -> Signal<T, NoError> {
|
|
return self.valuePromise.get()
|
|
}
|
|
}
|