in Sources/TwitterTextEditor/Scheduler.swift [135:182]
func schedule(_ input: Input, completion: @escaping Completion) {
let previousSchedule = schedule
schedule = Schedule(input: input, completion: completion)
// Debounce
if let previousSchedule = previousSchedule {
log(type: .debug, "Cancelled")
previousSchedule.completion(.failure(SchedulerError.cancelled))
return
}
RunLoop.main.perform {
guard let schedule = self.schedule else {
assertionFailure()
return
}
self.schedule = nil
// Cache
if let cache = self.cache, cache.key == schedule.input {
log(type: .debug, "Use cache")
schedule.completion(.success(cache.value))
return
}
// Latest
let token = NSObject()
self.latestToken = token
self.filter(schedule.input) { [weak self] result in
guard let self = self else {
return
}
guard let latestToken = self.latestToken, latestToken == token else {
log(type: .debug, "Not latest")
completion(.failure(SchedulerError.notLatest))
return
}
if case let .success(output) = result {
self.cache = Cache(key: schedule.input, value: output)
}
schedule.completion(result)
}
}
}