PageRenderTime 73ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/source/library/Interlace/ReactorUtilities/VoidDeferred.cs

https://bitbucket.org/VahidN/interlace
C# | 169 lines | 113 code | 31 blank | 25 comment | 0 complexity | 8f9399f8c6eb910a0e5c8ed2d7a40ac6 MD5 | raw file
  1. #region Using Directives and Copyright Notice
  2. // Copyright (c) 2007-2010, Computer Consultancy Pty Ltd
  3. // All rights reserved.
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are met:
  7. // * Redistributions of source code must retain the above copyright
  8. // notice, this list of conditions and the following disclaimer.
  9. // * Redistributions in binary form must reproduce the above copyright
  10. // notice, this list of conditions and the following disclaimer in the
  11. // documentation and/or other materials provided with the distribution.
  12. // * Neither the name of the Computer Consultancy Pty Ltd nor the
  13. // names of its contributors may be used to endorse or promote products
  14. // derived from this software without specific prior written permission.
  15. //
  16. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. // ARE DISCLAIMED. IN NO EVENT SHALL COMPUTER CONSULTANCY PTY LTD BE LIABLE
  20. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25. // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  26. // DAMAGE.
  27. using System;
  28. using System.Collections.Generic;
  29. using System.Text;
  30. #endregion
  31. namespace Interlace.ReactorUtilities
  32. {
  33. public class VoidDeferred : DeferredObject
  34. {
  35. public delegate void Callback();
  36. public delegate void CallbackWithState<TState>(TState state);
  37. public delegate void Failback(DeferredFailure result);
  38. public delegate void FailbackWithState<TState>(DeferredFailure result, TState state);
  39. public delegate TReturn ConvertingCallback<TReturn>();
  40. public delegate Deferred<TReturn> ChainingCallback<TReturn>();
  41. public delegate void ConvertingCallback();
  42. public delegate VoidDeferred ChainingCallback();
  43. public static VoidDeferred Success()
  44. {
  45. VoidDeferred deferred = new VoidDeferred();
  46. deferred.SucceedObject(null);
  47. return deferred;
  48. }
  49. public static VoidDeferred Failure(DeferredFailure failure)
  50. {
  51. VoidDeferred deferred = new VoidDeferred();
  52. deferred.Fail(failure);
  53. return deferred;
  54. }
  55. public void Completion(Callback callback, Failback failback)
  56. {
  57. ObjectCompletion(
  58. delegate(object result) { callback(); return null; },
  59. delegate(DeferredFailure failure) { failback(failure); return null; },
  60. null);
  61. }
  62. public void Completion<TState>(VoidDeferred deferred)
  63. {
  64. ObjectCompletion(IdentityCallback, IdentityFailback, deferred);
  65. }
  66. public void Completion<TState>(CallbackWithState<TState> callback, Failback failback, TState state)
  67. {
  68. ObjectCompletion(
  69. delegate(object result) { callback(state); return null; },
  70. delegate(DeferredFailure failure) { failback(failure); return null; },
  71. null);
  72. }
  73. public void Completion<TState>(CallbackWithState<TState> callback, FailbackWithState<TState> failback, TState state)
  74. {
  75. ObjectCompletion(
  76. delegate(object result) { callback(state); return null; },
  77. delegate(DeferredFailure failure) { failback(failure, state); return null; },
  78. null);
  79. }
  80. public void Succeed()
  81. {
  82. SucceedObject(null);
  83. }
  84. public Deferred<TReturn> Chained<TReturn>(ChainingCallback<TReturn> callback)
  85. {
  86. Deferred<TReturn> returnDeferred = new Deferred<TReturn>();
  87. ObjectCompletion(delegate(object result)
  88. {
  89. Deferred<TReturn> resultDeferred = callback();
  90. resultDeferred.Completion(returnDeferred);
  91. return null;
  92. },
  93. delegate(DeferredFailure failure)
  94. {
  95. returnDeferred.Fail(failure);
  96. return null;
  97. }, null);
  98. return returnDeferred;
  99. }
  100. public Deferred<TReturn> Converted<TReturn>(ConvertingCallback<TReturn> callback)
  101. {
  102. Deferred<TReturn> returnDeferred = new Deferred<TReturn>();
  103. ObjectCompletion(delegate(object result)
  104. {
  105. return callback();
  106. },
  107. IdentityFailback, returnDeferred);
  108. return returnDeferred;
  109. }
  110. public VoidDeferred Chained(ChainingCallback callback)
  111. {
  112. VoidDeferred returnDeferred = new VoidDeferred();
  113. ObjectCompletion(delegate(object result)
  114. {
  115. VoidDeferred resultDeferred = callback();
  116. resultDeferred.ObjectCompletion(IdentityCallback, IdentityFailback, returnDeferred);
  117. return null;
  118. },
  119. delegate(DeferredFailure failure)
  120. {
  121. returnDeferred.Fail(failure);
  122. return null;
  123. }, null);
  124. return returnDeferred;
  125. }
  126. public VoidDeferred Converted(ConvertingCallback callback)
  127. {
  128. VoidDeferred returnDeferred = new VoidDeferred();
  129. ObjectCompletion(delegate(object result)
  130. {
  131. callback();
  132. return null;
  133. },
  134. IdentityFailback, returnDeferred);
  135. return returnDeferred;
  136. }
  137. }
  138. }