func schedule()

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