import Foundation import UIKit import SwiftSignalKit final class ThrottledValue { private var value: T private let interval: Double private var previousSetTimestamp: Double private let valuePromise: ValuePromise 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 { return self.valuePromise.get() } }