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

    /// Run `block` after `self` is completed with specific queue.
    @discardableResult
    public func then<R>(queue: DispatchQueue, block: @escaping (Result) -> R) -> SDTask<R> {
        return self._apply(queue, suspend: nil, block: block)
    }
}


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

