     /// Suspend if `result` satisfies `predicate` with specific queue.
     @discardableResult
     public func suspend(queue: DispatchQueue, where predicate: @escaping (Result) -> Bool) -> SDTask<Result> {
-        return self._apply(queue, suspend: predicate) { $0 }
+        let result = SDTask<Result>(queue: queue)
+        let worker = result.createWorker { self.result }
+        result.worker = worker
+        self.worker.notify(queue: queue) {
+            if !predicate(self.result) {
+                worker.perform()
+            }
+        }
+        return result
     }
 }
 

    
    /// Result of task.
    public var result: Result {
        if completed {
            return storage.value!
        }
        return lck.synchronized(for: completed) { storage.value! }
    }
}


    /// Run `block` after `self` is completed with specific queue.
    @discardableResult
    public func then<R>(queue: DispatchQueue, block: @escaping (Result) -> R) -> SDTask<R> {
        let result = SDTask<R>(queue: queue)
        let worker = result.createWorker { block(self.result) }
        result.worker = worker
        self.worker.notify(queue: queue, execute: worker)
        return result
    }
}

