 public class PromiseFuture<T>: Future<T> {
   private let condition = Condition()
   private var completionCallbacks: [CompletionCallback] = []
+
+  override public var isCompleted: Bool {
+    return condition.synchronized { _ in
+      self.result != nil
+    }
+  }
 
   override private var futureName: String {
     return "PromiseFuture"


public class AsyncFuture<T>: Future<T> {
  private let Group = FutureExecution.makeGroup()

  override private var futureName: String {
    return "AsyncFuture"

  private var result: Try<T>?

  public var isCompleted: Bool {
    fatalError("must be overridden")
  }

  private var futureName: String {
