dispose.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /* eslint id-length: 0, max-lines: 0, max-statements: 0 */
  2. "use strict";
  3. var memoize = require("../..")
  4. , nextTick = require("next-tick")
  5. , delay = require("timers-ext/delay")
  6. , Promise = require("plain-promise");
  7. module.exports = function () {
  8. return {
  9. Regular: {
  10. "Sync": function (a) {
  11. var mfn, fn, value = [], x, invoked;
  12. fn = function (arg1, arg2) { return arg1 + arg2; };
  13. mfn = memoize(fn, { dispose: function (val) { value.push(val); } });
  14. mfn(3, 7);
  15. mfn(5, 8);
  16. mfn(12, 4);
  17. a.deep(value, [], "Pre");
  18. mfn.delete(5, 8);
  19. a.deep(value, [13], "#1");
  20. value = [];
  21. mfn.delete(12, 4);
  22. a.deep(value, [16], "#2");
  23. value = [];
  24. mfn(77, 11);
  25. mfn.clear();
  26. a.deep(value, [10, 88], "Clear all");
  27. x = {};
  28. invoked = false;
  29. mfn = memoize(function () { return x; }, {
  30. dispose: function (val) { invoked = val; }
  31. });
  32. mfn.delete();
  33. a(invoked, false, "No args: Post invalid delete");
  34. mfn();
  35. a(invoked, false, "No args: Post cache");
  36. mfn.delete();
  37. a(invoked, x, "No args: Pre delete");
  38. },
  39. "Ref counter": function (a) {
  40. var mfn, fn, value = [];
  41. fn = function (x, y) { return x + y; };
  42. mfn = memoize(fn, {
  43. refCounter: true,
  44. dispose: function (val) { value.push(val); }
  45. });
  46. mfn(3, 7);
  47. mfn(5, 8);
  48. mfn(12, 4);
  49. a.deep(value, [], "Pre");
  50. mfn(5, 8);
  51. mfn.deleteRef(5, 8);
  52. a.deep(value, [], "Pre");
  53. mfn.deleteRef(5, 8);
  54. a.deep(value, [13], "#1");
  55. value = [];
  56. mfn.deleteRef(12, 4);
  57. a.deep(value, [16], "#2");
  58. value = [];
  59. mfn(77, 11);
  60. mfn.clear();
  61. a.deep(value, [10, 88], "Clear all");
  62. },
  63. "Async": function (a, d) {
  64. var mfn, fn, u = {}, value = [];
  65. fn = function (x, y, cb) {
  66. nextTick(function () { cb(null, x + y); });
  67. return u;
  68. };
  69. mfn = memoize(fn, { async: true, dispose: function (val) { value.push(val); } });
  70. mfn(3, 7, function () {
  71. mfn(5, 8, function () {
  72. mfn(12, 4, function () {
  73. a.deep(value, [], "Pre");
  74. mfn.delete(5, 8);
  75. a.deep(value, [13], "#1");
  76. value = [];
  77. mfn.delete(12, 4);
  78. a.deep(value, [16], "#2");
  79. value = [];
  80. mfn(77, 11, function () {
  81. mfn.clear();
  82. a.deep(value, [10, 88], "Clear all");
  83. d();
  84. });
  85. });
  86. });
  87. });
  88. },
  89. "Promise": function (a, d) {
  90. var mfn, fn, value = [];
  91. fn = function (x, y) {
  92. return new Promise(function (res) { res(x + y); });
  93. };
  94. mfn = memoize(fn, { promise: true, dispose: function (val) { value.push(val); } });
  95. mfn(3, 7).done(function () {
  96. mfn(5, 8).done(function () {
  97. mfn(12, 4).done(
  98. delay(function () {
  99. a.deep(value, [], "Pre");
  100. mfn.delete(5, 8);
  101. a.deep(value, [13], "#1");
  102. value = [];
  103. mfn.delete(12, 4);
  104. a.deep(value, [16], "#2");
  105. value = [];
  106. mfn(77, 11).done(
  107. delay(function () {
  108. mfn.clear();
  109. a.deep(value, [10, 88], "Clear all");
  110. d();
  111. })
  112. );
  113. })
  114. );
  115. });
  116. });
  117. }
  118. },
  119. Primitive: {
  120. "Sync": function (a) {
  121. var mfn, fn, value = [];
  122. fn = function (x, y) { return x + y; };
  123. mfn = memoize(fn, { dispose: function (val) { value.push(val); } });
  124. mfn(3, 7);
  125. mfn(5, 8);
  126. mfn(12, 4);
  127. a.deep(value, [], "Pre");
  128. mfn.delete(5, 8);
  129. a.deep(value, [13], "#1");
  130. value = [];
  131. mfn.delete(12, 4);
  132. a.deep(value, [16], "#2");
  133. value = [];
  134. mfn(77, 11);
  135. mfn.clear();
  136. a.deep(value, [10, 88], "Clear all");
  137. },
  138. "Ref counter": function (a) {
  139. var mfn, fn, value = [];
  140. fn = function (x, y) { return x + y; };
  141. mfn = memoize(fn, {
  142. refCounter: true,
  143. dispose: function (val) { value.push(val); }
  144. });
  145. mfn(3, 7);
  146. mfn(5, 8);
  147. mfn(12, 4);
  148. a.deep(value, [], "Pre");
  149. mfn(5, 8);
  150. mfn.deleteRef(5, 8);
  151. a.deep(value, [], "Pre");
  152. mfn.deleteRef(5, 8);
  153. a.deep(value, [13], "#1");
  154. value = [];
  155. mfn.deleteRef(12, 4);
  156. a.deep(value, [16], "#2");
  157. value = [];
  158. mfn(77, 11);
  159. mfn.clear();
  160. a.deep(value, [10, 88], "Clear all");
  161. },
  162. "Async": function (a, d) {
  163. var mfn, fn, u = {}, value = [];
  164. fn = function (x, y, cb) {
  165. nextTick(function () { cb(null, x + y); });
  166. return u;
  167. };
  168. mfn = memoize(fn, { async: true, dispose: function (val) { value.push(val); } });
  169. mfn(3, 7, function () {
  170. mfn(5, 8, function () {
  171. mfn(12, 4, function () {
  172. a.deep(value, [], "Pre");
  173. mfn.delete(5, 8);
  174. a.deep(value, [13], "#1");
  175. value = [];
  176. mfn.delete(12, 4);
  177. a.deep(value, [16], "#2");
  178. value = [];
  179. mfn(77, 11, function () {
  180. mfn.clear();
  181. a.deep(value, [10, 88], "Clear all");
  182. d();
  183. });
  184. });
  185. });
  186. });
  187. },
  188. "Promise": function (a, d) {
  189. var mfn, fn, value = [];
  190. fn = function (x, y) {
  191. return new Promise(function (res) { res(x + y); });
  192. };
  193. mfn = memoize(fn, { promise: true, dispose: function (val) { value.push(val); } });
  194. mfn(3, 7).done(function () {
  195. mfn(5, 8).done(function () {
  196. mfn(12, 4).done(
  197. delay(function () {
  198. a.deep(value, [], "Pre");
  199. mfn.delete(5, 8);
  200. a.deep(value, [13], "#1");
  201. value = [];
  202. mfn.delete(12, 4);
  203. a.deep(value, [16], "#2");
  204. value = [];
  205. mfn(77, 11).done(
  206. delay(function () {
  207. mfn.clear();
  208. a.deep(value, [10, 88], "Clear all");
  209. d();
  210. })
  211. );
  212. })
  213. );
  214. });
  215. });
  216. }
  217. }
  218. };
  219. };