Swiftgram/TelegramUI/ThrottledValue.swift
2018-06-16 20:03:02 +03:00

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()
}
}