diff Implab/Promise.cs @ 75:4439140706d0 v2

major refactoring, added tasks support
author cin
date Wed, 10 Sep 2014 11:17:37 +0400
parents c4140283575c
children c761fc982e1d
line wrap: on
line diff
--- a/Implab/Promise.cs	Mon Sep 08 17:40:46 2014 +0400
+++ b/Implab/Promise.cs	Wed Sep 10 11:17:37 2014 +0400
@@ -225,6 +225,18 @@
             Cancel();
         }
 
+
+        public IPromise<T> Then(ResultHandler<T> success, ErrorHandler<T> error, Action cancel) {
+            if (success == null && error == null && cancel == null)
+                return this;
+
+            var medium = new Promise<T>(this, true);
+
+            AddHandler(success, error, cancel, medium);
+
+            return medium;
+        }
+
         /// <summary>
         /// Adds new handlers to this promise.
         /// </summary>
@@ -243,6 +255,17 @@
             return medium;
         }
 
+        public IPromise Then(Action success, ErrorHandler error, Action cancel) {
+            return Then(
+                x => success(),
+                e => {
+                    error(e);
+                    return default(T);
+                },
+                cancel
+            );
+        }
+
         public IPromise Then(Action success, ErrorHandler error) {
             return Then(
                 x => success(),
@@ -269,6 +292,39 @@
             return medium;
         }
 
+        public void Last(ResultHandler<T> success, ErrorHandler error, Action cancel) {
+            if (success == null && error == null && cancel == null)
+                return;
+
+            ErrorHandler<T> errorHandler = null;
+            if (error != null)
+                errorHandler = err => {
+                    error(err);
+                    return default(T);
+                };
+            AddHandler(success, errorHandler, cancel, null);
+        }
+
+        public void Last(ResultHandler<T> success, ErrorHandler error) {
+            Last(success, error, null);
+        }
+
+        public void Last(ResultHandler<T> success) {
+            Last(success, null, null);
+        }
+
+        public void Last(Action success,ErrorHandler error, Action cancel) {
+            Last(x => success(), error, cancel);
+        }
+
+        public void Last(Action success,ErrorHandler error) {
+            Last(x => success(), error, null);
+        }
+
+        public void Last(Action success) {
+            Last(x => success(), null, null);
+        }
+
         public IPromise Error(ErrorHandler error) {
             if (error == null)
                 return this;
@@ -307,25 +363,6 @@
             return medium;
         }
 
-        public IPromise<T> Anyway(Action handler) {
-            if (handler == null)
-                return this;
-
-            var medium = new Promise<T>(this, true);
-
-            AddHandler(
-                x => handler(),
-                e => {
-                    handler();
-                    throw new TransientPromiseException(e);
-                },
-                null,
-                medium
-            );
-
-            return medium;
-        }
-
         /// <summary>
         /// Позволяет преобразовать результат выполения операции к новому типу.
         /// </summary>
@@ -334,7 +371,7 @@
         /// <param name="error">Обработчик ошибки. Данный обработчик получит
         /// исключение возникшее при выполнении операции.</param>
         /// <returns>Новое обещание, которое будет выполнено при выполнении исходного обещания.</returns>
-        public IPromise<TNew> Map<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<T> error) {
+        public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<T> error) {
             if (mapper == null)
                 throw new ArgumentNullException("mapper");
 
@@ -370,8 +407,8 @@
             return chained;
         }
 
-        public IPromise<TNew> Map<TNew>(ResultMapper<T, TNew> mapper) {
-            return Map(mapper, null);
+        public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper) {
+            return Then(mapper, null);
         }
 
         /// <summary>
@@ -384,7 +421,7 @@
         /// <param name="error">Обработчик ошибки. Данный обработчик получит
         /// исключение возникшее при выполнении текуещй операции.</param>
         /// <returns>Новое обещание, которое будет выполнено по окончанию указанной аснхронной операции.</returns>
-        public IPromise<TNew> Chain<TNew>(ChainedOperation<T, TNew> chained, ErrorHandler<T> error) {
+        public IPromise<TNew> Then<TNew>(ChainedOperation<T, TNew> chained, ErrorHandler<T> error) {
 
             // проблема в том, что на момент связывания еще не начата асинхронная операция, поэтому нужно
             // создать посредника, к которому будут подвызяваться следующие обработчики.
@@ -442,8 +479,8 @@
             return medium;
         }
 
-        public IPromise<TNew> Chain<TNew>(ChainedOperation<T, TNew> chained) {
-            return Chain(chained, null);
+        public IPromise<TNew> Then<TNew>(ChainedOperation<T, TNew> chained) {
+            return Then(chained, null);
         }
 
         public IPromise<T> Cancelled(Action handler) {
@@ -478,7 +515,7 @@
         /// <typeparam name="T2"></typeparam>
         /// <returns></returns>
         public IPromise<T2> Cast<T2>() {
-            return Map(x => (T2)(object)x, null);
+            return Then(x => (T2)(object)x, null);
         }
 
         /// <summary>
@@ -504,8 +541,7 @@
         /// <returns>Результат выполнения обещания</returns>
         public T Join(int timeout) {
             var evt = new ManualResetEvent(false);
-            Anyway(() => evt.Set());
-            Cancelled(() => evt.Set());
+            Finally(() => evt.Set());
 
             if (!evt.WaitOne(timeout, true))
                 throw new TimeoutException();
@@ -704,10 +740,6 @@
             return Error(error);
         }
 
-        IPromise IPromise.Anyway(Action handler) {
-            return Anyway(handler);
-        }
-
         IPromise IPromise.Finally(Action handler) {
             return Finally(handler);
         }