func async<T, N>(_ delta: Double, param: T, task: @escaping (_ value: T) -> N, callFunc: @escaping (_ result: N) -> ()) {
func doTaskThenCallback() {
let t = task(param)
DispatchQueue.main.async(execute: {
callFunc(t)
})
}
if delta > 0.0 {
DispatchQueue.global().asyncAfter(
deadline: DispatchTime.now() + Double(Int64(delta * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) {
doTaskThenCallback()
}
} else {
DispatchQueue.global().async {
doTaskThenCallback()
}
}
}
func async<T, N>(_ delta: Do