Add isCanceled/Completed to CancelableOperation (#79)

Closes #78
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c71ac91..3d543da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
 ## 2.1.0
 
 * Fix `CancelableOperation.valueOrCancellation`'s type signature
+* Add `isCanceled` and `isCompleted` to `CancelableOperation`.
 
 ## 2.0.8
 
diff --git a/lib/src/cancelable_operation.dart b/lib/src/cancelable_operation.dart
index e6115cb..faf9076 100644
--- a/lib/src/cancelable_operation.dart
+++ b/lib/src/cancelable_operation.dart
@@ -80,6 +80,12 @@
   /// This returns the [Future] returned by the [CancelableCompleter]'s
   /// `onCancel` callback. Unlike [Stream.cancel], it never returns `null`.
   Future cancel() => _completer._cancel();
+
+  /// Whether this operation has been canceled before it completed.
+  bool get isCanceled => _completer.isCanceled;
+
+  /// Whether this operation completed before being canceled.
+  bool get isCompleted => _completer.isCompleted;
 }
 
 /// A completer for a [CancelableOperation].
diff --git a/test/cancelable_operation_test.dart b/test/cancelable_operation_test.dart
index 4a23856..384a023 100644
--- a/test/cancelable_operation_test.dart
+++ b/test/cancelable_operation_test.dart
@@ -40,8 +40,10 @@
     test("sends errors in a future to the future", () {
       expect(completer.operation.value, throwsA("error"));
       expect(completer.isCompleted, isFalse);
+      expect(completer.operation.isCompleted, isFalse);
       completer.complete(Future.error("error"));
       expect(completer.isCompleted, isTrue);
+      expect(completer.operation.isCompleted, isTrue);
     });
 
     test("sends values to valueOrCancellation", () {
@@ -122,11 +124,15 @@
 
       expect(canceled, isFalse);
       expect(completer.isCanceled, isFalse);
+      expect(completer.operation.isCanceled, isFalse);
       expect(completer.isCompleted, isFalse);
+      expect(completer.operation.isCompleted, isFalse);
       completer.operation.cancel();
       expect(canceled, isTrue);
       expect(completer.isCanceled, isTrue);
+      expect(completer.operation.isCanceled, isTrue);
       expect(completer.isCompleted, isFalse);
+      expect(completer.operation.isCompleted, isFalse);
     });
 
     test("returns the onCancel future each time cancel is called", () {