// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation extension Timer { @discardableResult public static func scheduledTimerOnMainThread( withTimeInterval timeInterval: TimeInterval, repeats: Bool = false, using dependencies: Dependencies = Dependencies(), block: @escaping (Timer) -> Void ) -> Timer { let timer = Timer(timeInterval: timeInterval, repeats: repeats, block: block) // If we are forcing synchrnonous execution (ie. running unit tests) then ceil the // timeInterval for execution and append it to the execution set so the test can // trigger the logic in a synchronous way) guard !dependencies.forceSynchronous else { dependencies.asyncExecutions.appendTo(Int(ceil(dependencies.dateNow.timeIntervalSince1970 + timeInterval))) { block(timer) } return timer } RunLoop.main.add(timer, forMode: .common) return timer } }