aboutsummaryrefslogtreecommitdiffstats
path: root/AndroidAsync/src/com/koushikdutta/async/Continuation.java
diff options
context:
space:
mode:
Diffstat (limited to 'AndroidAsync/src/com/koushikdutta/async/Continuation.java')
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/Continuation.java54
1 files changed, 54 insertions, 0 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/Continuation.java b/AndroidAsync/src/com/koushikdutta/async/Continuation.java
new file mode 100644
index 0000000..e9b1719
--- /dev/null
+++ b/AndroidAsync/src/com/koushikdutta/async/Continuation.java
@@ -0,0 +1,54 @@
+package com.koushikdutta.async;
+
+import java.util.LinkedList;
+
+import junit.framework.Assert;
+
+import com.koushikdutta.async.callback.CompletedCallback;
+import com.koushikdutta.async.callback.ContinuationCallback;
+
+public class Continuation {
+ CompletedCallback callback;
+ CompletedCallback wrapper;
+ public Continuation(CompletedCallback callback) {
+ this.callback = callback;
+ wrapper = new CompletedCallback() {
+ @Override
+ public void onCompleted(Exception ex) {
+ if (ex == null) {
+ next();
+ return;
+ }
+ Continuation.this.callback.onCompleted(ex);
+ }
+ };
+ }
+
+ LinkedList<ContinuationCallback> mCallbacks = new LinkedList<ContinuationCallback>();
+
+ public void add(ContinuationCallback callback) {
+ mCallbacks.add(callback);
+ }
+
+ private void next() {
+ if (mCallbacks.size() > 0) {
+ ContinuationCallback cb = mCallbacks.remove();
+ try {
+ cb.onContinue(wrapper);
+ }
+ catch (Exception e) {
+ callback.onCompleted(e);
+ }
+ return;
+ }
+
+ callback.onCompleted(null);
+ }
+
+ boolean started;
+ public void start() {
+ Assert.assertTrue(!started);
+ started = true;
+ next();
+ }
+}