max.js 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677
  1. /* eslint id-length: 0, max-lines: 0, max-statements: 0, max-nested-callbacks: 0, no-shadow: 0, max-len: 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,
  12. fn,
  13. i = 0;
  14. fn = function (x, y) {
  15. ++i;
  16. return x + y;
  17. };
  18. mfn = memoize(fn, { max: 3 });
  19. a(mfn(3, 7), 10, "Result #1");
  20. a(i, 1, "Called #1");
  21. a(mfn(3, 7), 10, "Result #2");
  22. a(i, 1, "Called #2");
  23. a(mfn(5, 8), 13, "Result B #1");
  24. a(i, 2, "Called B #1");
  25. a(mfn(3, 7), 10, "Result #3");
  26. a(i, 2, "Called #3");
  27. a(mfn(5, 8), 13, "Result B #2");
  28. a(i, 2, "Called B #2");
  29. a(mfn(12, 4), 16, "Result C #1");
  30. a(i, 3, "Called C #1");
  31. a(mfn(3, 7), 10, "Result #4");
  32. a(i, 3, "Called #4");
  33. a(mfn(5, 8), 13, "Result B #3");
  34. a(i, 3, "Called B #3");
  35. a(mfn(77, 11), 88, "Result D #1"); // Delete 12, 4
  36. a(i, 4, "Called D #1");
  37. a(mfn(5, 8), 13, "Result B #4");
  38. a(i, 4, "Called B #4");
  39. a(mfn(12, 4), 16, "Result C #2"); // Delete 3, 7
  40. a(i, 5, "Called C #2");
  41. a(mfn(3, 7), 10, "Result #5"); // Delete 77, 11
  42. a(i, 6, "Called #5");
  43. a(mfn(77, 11), 88, "Result D #2"); // Delete 5, 8
  44. a(i, 7, "Called D #2");
  45. a(mfn(12, 4), 16, "Result C #3");
  46. a(i, 7, "Called C #3");
  47. a(mfn(5, 8), 13, "Result B #5"); // Delete 3, 7
  48. a(i, 8, "Called B #5");
  49. a(mfn(77, 11), 88, "Result D #3");
  50. a(i, 8, "Called D #3");
  51. mfn.delete(77, 11);
  52. a(mfn(77, 11), 88, "Result D #4");
  53. a(i, 9, "Called D #4");
  54. mfn.clear();
  55. a(mfn(5, 8), 13, "Result B #6");
  56. a(i, 10, "Called B #6");
  57. a(mfn(77, 11), 88, "Result D #5");
  58. a(i, 11, "Called D #5");
  59. },
  60. Async: function (a, d) {
  61. var mfn,
  62. fn,
  63. u = {},
  64. i = 0;
  65. fn = function (x, y, cb) {
  66. nextTick(function () {
  67. ++i;
  68. cb(null, x + y);
  69. });
  70. return u;
  71. };
  72. mfn = memoize(fn, { async: true, max: 3 });
  73. a(
  74. mfn(3, 7, function (err, res) {
  75. a.deep([err, res], [null, 10], "Result #1");
  76. a(i, 1, "Called #1");
  77. a(
  78. mfn(3, 7, function (err, res) {
  79. a.deep([err, res], [null, 10], "Result #2");
  80. a(i, 1, "Called #2");
  81. a(
  82. mfn(5, 8, function (err, res) {
  83. a.deep([err, res], [null, 13], "Result B #1");
  84. a(i, 2, "Called B #1");
  85. a(
  86. mfn(3, 7, function (err, res) {
  87. a.deep([err, res], [null, 10], "Result #3");
  88. a(i, 2, "Called #3");
  89. a(
  90. mfn(5, 8, function (err, res) {
  91. a.deep(
  92. [err, res],
  93. [null, 13],
  94. "Result B #2"
  95. );
  96. a(i, 2, "Called B #2");
  97. a(
  98. mfn(12, 4, function (err, res) {
  99. a.deep(
  100. [err, res],
  101. [null, 16],
  102. "Result C #1"
  103. );
  104. a(i, 3, "Called C #1");
  105. a(
  106. mfn(3, 7, function (err, res) {
  107. a.deep(
  108. [err, res],
  109. [null, 10],
  110. "Result #4"
  111. );
  112. a(i, 3, "Called #4");
  113. a(
  114. mfn(5, 8, function (
  115. err,
  116. res
  117. ) {
  118. a.deep(
  119. [err, res],
  120. [null, 13],
  121. "Result B #3"
  122. );
  123. a(
  124. i,
  125. 3,
  126. "Called B #3"
  127. );
  128. a(
  129. mfn(
  130. 77,
  131. 11,
  132. function (
  133. err,
  134. res
  135. ) {
  136. a.deep(
  137. [
  138. err,
  139. res
  140. ],
  141. [
  142. null,
  143. 88
  144. ],
  145. "Result D #1"
  146. );
  147. a(
  148. i,
  149. 4,
  150. "Called D #1"
  151. );
  152. a(
  153. mfn(
  154. 5,
  155. 8,
  156. function (
  157. err,
  158. res
  159. ) {
  160. a.deep(
  161. [
  162. err,
  163. res
  164. ],
  165. [
  166. null,
  167. 13
  168. ],
  169. "Result B #4"
  170. );
  171. a(
  172. i,
  173. 4,
  174. "Called B #4"
  175. );
  176. a(
  177. mfn(
  178. 12,
  179. 4,
  180. function (
  181. err,
  182. res
  183. ) {
  184. a.deep(
  185. [
  186. err,
  187. res
  188. ],
  189. [
  190. null,
  191. 16
  192. ],
  193. "Result C #2"
  194. );
  195. a(
  196. i,
  197. 5,
  198. "Called C #2"
  199. );
  200. a(
  201. mfn(
  202. 3,
  203. 7,
  204. function (
  205. err,
  206. res
  207. ) {
  208. a.deep(
  209. [
  210. err,
  211. res
  212. ],
  213. [
  214. null,
  215. 10
  216. ],
  217. "Result #5"
  218. );
  219. a(
  220. i,
  221. 6,
  222. "Called #5"
  223. );
  224. a(
  225. mfn(
  226. 77,
  227. 11,
  228. function (
  229. err,
  230. res
  231. ) {
  232. a.deep(
  233. [
  234. err,
  235. res
  236. ],
  237. [
  238. null,
  239. 88
  240. ],
  241. "Result D #2"
  242. );
  243. a(
  244. i,
  245. 7,
  246. "Called D #2"
  247. );
  248. a(
  249. mfn(
  250. 12,
  251. 4,
  252. function (
  253. err,
  254. res
  255. ) {
  256. a.deep(
  257. [
  258. err,
  259. res
  260. ],
  261. [
  262. null,
  263. 16
  264. ],
  265. "Result C #3"
  266. );
  267. a(
  268. i,
  269. 7,
  270. "Called C #3"
  271. );
  272. a(
  273. mfn(
  274. 5,
  275. 8,
  276. function (
  277. err,
  278. res
  279. ) {
  280. a.deep(
  281. [
  282. err,
  283. res
  284. ],
  285. [
  286. null,
  287. 13
  288. ],
  289. "Result B #5"
  290. );
  291. a(
  292. i,
  293. 8,
  294. "Called B #5"
  295. );
  296. a(
  297. mfn(
  298. 77,
  299. 11,
  300. function (
  301. err,
  302. res
  303. ) {
  304. a.deep(
  305. [
  306. err,
  307. res
  308. ],
  309. [
  310. null,
  311. 88
  312. ],
  313. "Result D #3"
  314. );
  315. a(
  316. i,
  317. 8,
  318. "Called D #3"
  319. );
  320. mfn.delete(
  321. 77,
  322. 11
  323. );
  324. a(
  325. mfn(
  326. 77,
  327. 11,
  328. function (
  329. err,
  330. res
  331. ) {
  332. a.deep(
  333. [
  334. err,
  335. res
  336. ],
  337. [
  338. null,
  339. 88
  340. ],
  341. "Result D #4"
  342. );
  343. a(
  344. i,
  345. 9,
  346. "Called D #4"
  347. );
  348. mfn.clear();
  349. a(
  350. mfn(
  351. 5,
  352. 8,
  353. function (
  354. err,
  355. res
  356. ) {
  357. a.deep(
  358. [
  359. err,
  360. res
  361. ],
  362. [
  363. null,
  364. 13
  365. ],
  366. "Result B #6"
  367. );
  368. a(
  369. i,
  370. 10,
  371. "Called B #6"
  372. );
  373. a(
  374. mfn(
  375. 77,
  376. 11,
  377. function (
  378. err,
  379. res
  380. ) {
  381. a.deep(
  382. [
  383. err,
  384. res
  385. ],
  386. [
  387. null,
  388. 88
  389. ],
  390. "Result D #5"
  391. );
  392. a(
  393. i,
  394. 11,
  395. "Called D #5"
  396. );
  397. d();
  398. }
  399. ),
  400. u,
  401. "Initial D #5"
  402. );
  403. }
  404. ),
  405. u,
  406. "Initial B #6"
  407. );
  408. }
  409. ),
  410. u,
  411. "Initial D #4"
  412. );
  413. }
  414. ),
  415. u,
  416. "Initial D #3"
  417. );
  418. }
  419. ),
  420. u,
  421. "Initial B #5"
  422. );
  423. }
  424. ),
  425. u,
  426. "Initial C #3"
  427. );
  428. }
  429. ),
  430. u,
  431. "Initial D #2"
  432. );
  433. }
  434. ),
  435. u,
  436. "Initial #5"
  437. );
  438. }
  439. ),
  440. u,
  441. "Initial C #2"
  442. );
  443. }
  444. ),
  445. u,
  446. "Initial B #4"
  447. );
  448. }
  449. ),
  450. u,
  451. "Initial D #1"
  452. );
  453. }),
  454. u,
  455. "Initial B #3"
  456. );
  457. }),
  458. u,
  459. "Initial #4"
  460. );
  461. }),
  462. u,
  463. "Initial C #1"
  464. );
  465. }),
  466. u,
  467. "Initial B #2"
  468. );
  469. }),
  470. u,
  471. "Initial #3"
  472. );
  473. }),
  474. u,
  475. "Initial B #1"
  476. );
  477. }),
  478. u,
  479. "Initial #2"
  480. );
  481. }),
  482. u,
  483. "Initial #1"
  484. );
  485. },
  486. Promise: function (a, d) {
  487. var mfn,
  488. fn,
  489. i = 0;
  490. fn = function (x, y) {
  491. ++i;
  492. return new Promise(function (res) {
  493. res(x + y);
  494. });
  495. };
  496. mfn = memoize(fn, { promise: true, max: 3 });
  497. mfn(3, 7).done(
  498. delay(function (res) {
  499. // [3,7]
  500. a(res, 10, "Result #1");
  501. a(i, 1, "Called #1");
  502. mfn(3, 7).done(
  503. delay(function (res) {
  504. a(res, 10, "Result #2");
  505. a(i, 1, "Called #2");
  506. mfn(5, 8).done(
  507. delay(function (res) {
  508. // [3,7], [5,8]
  509. a(res, 13, "Result B #1");
  510. a(i, 2, "Called B #1");
  511. mfn(3, 7).done(
  512. delay(function (res) {
  513. // [5,8], [3, 7]
  514. a(res, 10, "Result #3");
  515. a(i, 2, "Called #3");
  516. mfn(5, 8).done(
  517. delay(function (res) {
  518. // [3,7], [5,8]
  519. a(res, 13, "Result B #2");
  520. a(i, 2, "Called B #2");
  521. mfn(12, 4).done(
  522. delay(function (res) {
  523. // [3,7], [5,8], [12, 4]
  524. a(res, 16, "Result C #1");
  525. a(i, 3, "Called C #1");
  526. mfn(3, 7).done(
  527. delay(function (res) {
  528. // [5,8], [12, 4], [3, 7]
  529. a(res, 10, "Result #4");
  530. a(i, 3, "Called #4");
  531. mfn(5, 8).done(
  532. delay(function (res) {
  533. // [12, 4], [3, 7], [5, 8]
  534. a(
  535. res,
  536. 13,
  537. "Result B #3"
  538. );
  539. a(
  540. i,
  541. 3,
  542. "Called B #3"
  543. );
  544. mfn(77, 11).done(
  545. delay(function (
  546. res
  547. ) {
  548. // [3, 7], [5, 8], [77, 11]
  549. a(
  550. res,
  551. 88,
  552. "Result D #1"
  553. );
  554. a(
  555. i,
  556. 4,
  557. "Called D #1"
  558. );
  559. mfn(
  560. 5,
  561. 8
  562. ).done(
  563. delay(
  564. function (
  565. res
  566. ) {
  567. // [3, 7], [77, 11], [5, 8]
  568. a(
  569. res,
  570. 13,
  571. "Result B #4"
  572. );
  573. a(
  574. i,
  575. 4,
  576. "Called B #4"
  577. );
  578. mfn(
  579. 12,
  580. 4
  581. ).done(
  582. delay(
  583. function (
  584. res
  585. ) {
  586. // [77, 11], [5, 8], [12, 4]
  587. a(
  588. res,
  589. 16,
  590. "Result C #2"
  591. );
  592. a(
  593. i,
  594. 5,
  595. "Called C #2"
  596. );
  597. mfn(
  598. 3,
  599. 7
  600. ).done(
  601. delay(
  602. function (
  603. res
  604. ) {
  605. a(
  606. res,
  607. 10,
  608. "Result #5"
  609. );
  610. a(
  611. i,
  612. 6,
  613. "Called #5"
  614. );
  615. mfn(
  616. 77,
  617. 11
  618. ).done(
  619. delay(
  620. function (
  621. res
  622. ) {
  623. a(
  624. res,
  625. 88,
  626. "Result D #2"
  627. );
  628. a(
  629. i,
  630. 7,
  631. "Called D #2"
  632. );
  633. mfn(
  634. 12,
  635. 4
  636. ).done(
  637. delay(
  638. function (
  639. res
  640. ) {
  641. a(
  642. res,
  643. 16,
  644. "Result C #3"
  645. );
  646. a(
  647. i,
  648. 7,
  649. "Called C #3"
  650. );
  651. mfn(
  652. 5,
  653. 8
  654. ).done(
  655. delay(
  656. function (
  657. res
  658. ) {
  659. a(
  660. res,
  661. 13,
  662. "Result B #5"
  663. );
  664. a(
  665. i,
  666. 8,
  667. "Called B #5"
  668. );
  669. mfn(
  670. 77,
  671. 11
  672. ).done(
  673. delay(
  674. function (
  675. res
  676. ) {
  677. a(
  678. res,
  679. 88,
  680. "Result D #3"
  681. );
  682. a(
  683. i,
  684. 8,
  685. "Called D #3"
  686. );
  687. mfn.delete(
  688. 77,
  689. 11
  690. );
  691. mfn(
  692. 77,
  693. 11
  694. ).done(
  695. delay(
  696. function (
  697. res
  698. ) {
  699. a(
  700. res,
  701. 88,
  702. "Result D #4"
  703. );
  704. a(
  705. i,
  706. 9,
  707. "Called D #4"
  708. );
  709. mfn.clear();
  710. mfn(
  711. 5,
  712. 8
  713. ).done(
  714. delay(
  715. function (
  716. res
  717. ) {
  718. a(
  719. res,
  720. 13,
  721. "Result B #6"
  722. );
  723. a(
  724. i,
  725. 10,
  726. "Called B #6"
  727. );
  728. mfn(
  729. 77,
  730. 11
  731. ).done(
  732. delay(
  733. function (
  734. res
  735. ) {
  736. a(
  737. res,
  738. 88,
  739. "Result D #5"
  740. );
  741. a(
  742. i,
  743. 11,
  744. "Called D #5"
  745. );
  746. d();
  747. }
  748. )
  749. );
  750. }
  751. )
  752. );
  753. }
  754. )
  755. );
  756. }
  757. )
  758. );
  759. }
  760. )
  761. );
  762. }
  763. )
  764. );
  765. }
  766. )
  767. );
  768. }
  769. )
  770. );
  771. }
  772. )
  773. );
  774. }
  775. )
  776. );
  777. })
  778. );
  779. })
  780. );
  781. })
  782. );
  783. })
  784. );
  785. })
  786. );
  787. })
  788. );
  789. })
  790. );
  791. })
  792. );
  793. })
  794. );
  795. }
  796. },
  797. Primitive: {
  798. Sync: function (a) {
  799. var mfn,
  800. fn,
  801. i = 0;
  802. fn = function (x, y) {
  803. ++i;
  804. return x + y;
  805. };
  806. mfn = memoize(fn, { primitive: true, max: 3 });
  807. a(mfn(3, 7), 10, "Result #1");
  808. a(i, 1, "Called #1");
  809. a(mfn(3, 7), 10, "Result #2");
  810. a(i, 1, "Called #2");
  811. a(mfn(5, 8), 13, "Result B #1");
  812. a(i, 2, "Called B #1");
  813. a(mfn(3, 7), 10, "Result #3");
  814. a(i, 2, "Called #3");
  815. a(mfn(5, 8), 13, "Result B #2");
  816. a(i, 2, "Called B #2");
  817. a(mfn(12, 4), 16, "Result C #1");
  818. a(i, 3, "Called C #1");
  819. a(mfn(3, 7), 10, "Result #4");
  820. a(i, 3, "Called #4");
  821. a(mfn(5, 8), 13, "Result B #3");
  822. a(i, 3, "Called B #3");
  823. a(mfn(77, 11), 88, "Result D #1"); // Delete 12, 4
  824. a(i, 4, "Called D #1");
  825. a(mfn(5, 8), 13, "Result B #4");
  826. a(i, 4, "Called B #4");
  827. a(mfn(12, 4), 16, "Result C #2"); // Delete 3, 7
  828. a(i, 5, "Called C #2");
  829. a(mfn(3, 7), 10, "Result #5"); // Delete 77, 11
  830. a(i, 6, "Called #5");
  831. a(mfn(77, 11), 88, "Result D #2"); // Delete 5, 8
  832. a(i, 7, "Called D #2");
  833. a(mfn(12, 4), 16, "Result C #3");
  834. a(i, 7, "Called C #3");
  835. a(mfn(5, 8), 13, "Result B #5"); // Delete 3, 7
  836. a(i, 8, "Called B #5");
  837. a(mfn(77, 11), 88, "Result D #3");
  838. a(i, 8, "Called D #3");
  839. mfn.delete(77, 11);
  840. a(mfn(77, 11), 88, "Result D #4");
  841. a(i, 9, "Called D #4");
  842. mfn.clear();
  843. a(mfn(5, 8), 13, "Result B #6");
  844. a(i, 10, "Called B #6");
  845. a(mfn(77, 11), 88, "Result D #5");
  846. a(i, 11, "Called D #5");
  847. },
  848. Async: function (a, d) {
  849. var mfn,
  850. fn,
  851. u = {},
  852. i = 0;
  853. fn = function (x, y, cb) {
  854. nextTick(function () {
  855. ++i;
  856. cb(null, x + y);
  857. });
  858. return u;
  859. };
  860. mfn = memoize(fn, { async: true, primitive: true, max: 3 });
  861. a(
  862. mfn(3, 7, function (err, res) {
  863. a.deep([err, res], [null, 10], "Result #1");
  864. a(i, 1, "Called #1");
  865. a(
  866. mfn(3, 7, function (err, res) {
  867. a.deep([err, res], [null, 10], "Result #2");
  868. a(i, 1, "Called #2");
  869. a(
  870. mfn(5, 8, function (err, res) {
  871. a.deep([err, res], [null, 13], "Result B #1");
  872. a(i, 2, "Called B #1");
  873. a(
  874. mfn(3, 7, function (err, res) {
  875. a.deep([err, res], [null, 10], "Result #3");
  876. a(i, 2, "Called #3");
  877. a(
  878. mfn(5, 8, function (err, res) {
  879. a.deep(
  880. [err, res],
  881. [null, 13],
  882. "Result B #2"
  883. );
  884. a(i, 2, "Called B #2");
  885. a(
  886. mfn(12, 4, function (err, res) {
  887. a.deep(
  888. [err, res],
  889. [null, 16],
  890. "Result C #1"
  891. );
  892. a(i, 3, "Called C #1");
  893. a(
  894. mfn(3, 7, function (err, res) {
  895. a.deep(
  896. [err, res],
  897. [null, 10],
  898. "Result #4"
  899. );
  900. a(i, 3, "Called #4");
  901. a(
  902. mfn(5, 8, function (
  903. err,
  904. res
  905. ) {
  906. a.deep(
  907. [err, res],
  908. [null, 13],
  909. "Result B #3"
  910. );
  911. a(
  912. i,
  913. 3,
  914. "Called B #3"
  915. );
  916. a(
  917. mfn(
  918. 77,
  919. 11,
  920. function (
  921. err,
  922. res
  923. ) {
  924. a.deep(
  925. [
  926. err,
  927. res
  928. ],
  929. [
  930. null,
  931. 88
  932. ],
  933. "Result D #1"
  934. );
  935. a(
  936. i,
  937. 4,
  938. "Called D #1"
  939. );
  940. a(
  941. mfn(
  942. 5,
  943. 8,
  944. function (
  945. err,
  946. res
  947. ) {
  948. a.deep(
  949. [
  950. err,
  951. res
  952. ],
  953. [
  954. null,
  955. 13
  956. ],
  957. "Result B #4"
  958. );
  959. a(
  960. i,
  961. 4,
  962. "Called B #4"
  963. );
  964. a(
  965. mfn(
  966. 12,
  967. 4,
  968. function (
  969. err,
  970. res
  971. ) {
  972. a.deep(
  973. [
  974. err,
  975. res
  976. ],
  977. [
  978. null,
  979. 16
  980. ],
  981. "Result C #2"
  982. );
  983. a(
  984. i,
  985. 5,
  986. "Called C #2"
  987. );
  988. a(
  989. mfn(
  990. 3,
  991. 7,
  992. function (
  993. err,
  994. res
  995. ) {
  996. a.deep(
  997. [
  998. err,
  999. res
  1000. ],
  1001. [
  1002. null,
  1003. 10
  1004. ],
  1005. "Result #5"
  1006. );
  1007. a(
  1008. i,
  1009. 6,
  1010. "Called #5"
  1011. );
  1012. a(
  1013. mfn(
  1014. 77,
  1015. 11,
  1016. function (
  1017. err,
  1018. res
  1019. ) {
  1020. a.deep(
  1021. [
  1022. err,
  1023. res
  1024. ],
  1025. [
  1026. null,
  1027. 88
  1028. ],
  1029. "Result D #2"
  1030. );
  1031. a(
  1032. i,
  1033. 7,
  1034. "Called D #2"
  1035. );
  1036. a(
  1037. mfn(
  1038. 12,
  1039. 4,
  1040. function (
  1041. err,
  1042. res
  1043. ) {
  1044. a.deep(
  1045. [
  1046. err,
  1047. res
  1048. ],
  1049. [
  1050. null,
  1051. 16
  1052. ],
  1053. "Result C #3"
  1054. );
  1055. a(
  1056. i,
  1057. 7,
  1058. "Called C #3"
  1059. );
  1060. a(
  1061. mfn(
  1062. 5,
  1063. 8,
  1064. function (
  1065. err,
  1066. res
  1067. ) {
  1068. a.deep(
  1069. [
  1070. err,
  1071. res
  1072. ],
  1073. [
  1074. null,
  1075. 13
  1076. ],
  1077. "Result B #5"
  1078. );
  1079. a(
  1080. i,
  1081. 8,
  1082. "Called B #5"
  1083. );
  1084. a(
  1085. mfn(
  1086. 77,
  1087. 11,
  1088. function (
  1089. err,
  1090. res
  1091. ) {
  1092. a.deep(
  1093. [
  1094. err,
  1095. res
  1096. ],
  1097. [
  1098. null,
  1099. 88
  1100. ],
  1101. "Result D #3"
  1102. );
  1103. a(
  1104. i,
  1105. 8,
  1106. "Called D #3"
  1107. );
  1108. mfn.delete(
  1109. 77,
  1110. 11
  1111. );
  1112. a(
  1113. mfn(
  1114. 77,
  1115. 11,
  1116. function (
  1117. err,
  1118. res
  1119. ) {
  1120. a.deep(
  1121. [
  1122. err,
  1123. res
  1124. ],
  1125. [
  1126. null,
  1127. 88
  1128. ],
  1129. "Result D #4"
  1130. );
  1131. a(
  1132. i,
  1133. 9,
  1134. "Called D #4"
  1135. );
  1136. mfn.clear();
  1137. a(
  1138. mfn(
  1139. 5,
  1140. 8,
  1141. function (
  1142. err,
  1143. res
  1144. ) {
  1145. a.deep(
  1146. [
  1147. err,
  1148. res
  1149. ],
  1150. [
  1151. null,
  1152. 13
  1153. ],
  1154. "Result B #6"
  1155. );
  1156. a(
  1157. i,
  1158. 10,
  1159. "Called B #6"
  1160. );
  1161. a(
  1162. mfn(
  1163. 77,
  1164. 11,
  1165. function (
  1166. err,
  1167. res
  1168. ) {
  1169. a.deep(
  1170. [
  1171. err,
  1172. res
  1173. ],
  1174. [
  1175. null,
  1176. 88
  1177. ],
  1178. "Result D #5"
  1179. );
  1180. a(
  1181. i,
  1182. 11,
  1183. "Called D #5"
  1184. );
  1185. d();
  1186. }
  1187. ),
  1188. u,
  1189. "Initial D #5"
  1190. );
  1191. }
  1192. ),
  1193. u,
  1194. "Initial B #6"
  1195. );
  1196. }
  1197. ),
  1198. u,
  1199. "Initial D #4"
  1200. );
  1201. }
  1202. ),
  1203. u,
  1204. "Initial D #3"
  1205. );
  1206. }
  1207. ),
  1208. u,
  1209. "Initial B #5"
  1210. );
  1211. }
  1212. ),
  1213. u,
  1214. "Initial C #3"
  1215. );
  1216. }
  1217. ),
  1218. u,
  1219. "Initial D #2"
  1220. );
  1221. }
  1222. ),
  1223. u,
  1224. "Initial #5"
  1225. );
  1226. }
  1227. ),
  1228. u,
  1229. "Initial C #2"
  1230. );
  1231. }
  1232. ),
  1233. u,
  1234. "Initial B #4"
  1235. );
  1236. }
  1237. ),
  1238. u,
  1239. "Initial D #1"
  1240. );
  1241. }),
  1242. u,
  1243. "Initial B #3"
  1244. );
  1245. }),
  1246. u,
  1247. "Initial #4"
  1248. );
  1249. }),
  1250. u,
  1251. "Initial C #1"
  1252. );
  1253. }),
  1254. u,
  1255. "Initial B #2"
  1256. );
  1257. }),
  1258. u,
  1259. "Initial #3"
  1260. );
  1261. }),
  1262. u,
  1263. "Initial B #1"
  1264. );
  1265. }),
  1266. u,
  1267. "Initial #2"
  1268. );
  1269. }),
  1270. u,
  1271. "Initial #1"
  1272. );
  1273. },
  1274. Promise: function (a, d) {
  1275. var mfn,
  1276. fn,
  1277. i = 0;
  1278. fn = function (x, y) {
  1279. ++i;
  1280. return new Promise(function (res) {
  1281. res(x + y);
  1282. });
  1283. };
  1284. mfn = memoize(fn, { promise: true, primitive: true, max: 3 });
  1285. mfn(3, 7).done(
  1286. delay(function (res) {
  1287. a(res, 10, "Result #1");
  1288. a(i, 1, "Called #1");
  1289. mfn(3, 7).done(
  1290. delay(function (res) {
  1291. a(res, 10, "Result #2");
  1292. a(i, 1, "Called #2");
  1293. mfn(5, 8).done(
  1294. delay(function (res) {
  1295. a(res, 13, "Result B #1");
  1296. a(i, 2, "Called B #1");
  1297. mfn(3, 7).done(
  1298. delay(function (res) {
  1299. a(res, 10, "Result #3");
  1300. a(i, 2, "Called #3");
  1301. mfn(5, 8).done(
  1302. delay(function (res) {
  1303. a(res, 13, "Result B #2");
  1304. a(i, 2, "Called B #2");
  1305. mfn(12, 4).done(
  1306. delay(function (res) {
  1307. a(res, 16, "Result C #1");
  1308. a(i, 3, "Called C #1");
  1309. mfn(3, 7).done(
  1310. delay(function (res) {
  1311. a(res, 10, "Result #4");
  1312. a(i, 3, "Called #4");
  1313. mfn(5, 8).done(
  1314. delay(function (res) {
  1315. a(
  1316. res,
  1317. 13,
  1318. "Result B #3"
  1319. );
  1320. a(
  1321. i,
  1322. 3,
  1323. "Called B #3"
  1324. );
  1325. mfn(77, 11).done(
  1326. delay(function (
  1327. res
  1328. ) {
  1329. a(
  1330. res,
  1331. 88,
  1332. "Result D #1"
  1333. );
  1334. a(
  1335. i,
  1336. 4,
  1337. "Called D #1"
  1338. );
  1339. mfn(
  1340. 5,
  1341. 8
  1342. ).done(
  1343. delay(
  1344. function (
  1345. res
  1346. ) {
  1347. a(
  1348. res,
  1349. 13,
  1350. "Result B #4"
  1351. );
  1352. a(
  1353. i,
  1354. 4,
  1355. "Called B #4"
  1356. );
  1357. mfn(
  1358. 12,
  1359. 4
  1360. ).done(
  1361. delay(
  1362. function (
  1363. res
  1364. ) {
  1365. a(
  1366. res,
  1367. 16,
  1368. "Result C #2"
  1369. );
  1370. a(
  1371. i,
  1372. 5,
  1373. "Called C #2"
  1374. );
  1375. mfn(
  1376. 3,
  1377. 7
  1378. ).done(
  1379. delay(
  1380. function (
  1381. res
  1382. ) {
  1383. a(
  1384. res,
  1385. 10,
  1386. "Result #5"
  1387. );
  1388. a(
  1389. i,
  1390. 6,
  1391. "Called #5"
  1392. );
  1393. mfn(
  1394. 77,
  1395. 11
  1396. ).done(
  1397. delay(
  1398. function (
  1399. res
  1400. ) {
  1401. a(
  1402. res,
  1403. 88,
  1404. "Result D #2"
  1405. );
  1406. a(
  1407. i,
  1408. 7,
  1409. "Called D #2"
  1410. );
  1411. mfn(
  1412. 12,
  1413. 4
  1414. ).done(
  1415. delay(
  1416. function (
  1417. res
  1418. ) {
  1419. a(
  1420. res,
  1421. 16,
  1422. "Result C #3"
  1423. );
  1424. a(
  1425. i,
  1426. 7,
  1427. "Called C #3"
  1428. );
  1429. mfn(
  1430. 5,
  1431. 8
  1432. ).done(
  1433. delay(
  1434. function (
  1435. res
  1436. ) {
  1437. a(
  1438. res,
  1439. 13,
  1440. "Result B #5"
  1441. );
  1442. a(
  1443. i,
  1444. 8,
  1445. "Called B #5"
  1446. );
  1447. mfn(
  1448. 77,
  1449. 11
  1450. ).done(
  1451. delay(
  1452. function (
  1453. res
  1454. ) {
  1455. a(
  1456. res,
  1457. 88,
  1458. "Result D #3"
  1459. );
  1460. a(
  1461. i,
  1462. 8,
  1463. "Called D #3"
  1464. );
  1465. mfn.delete(
  1466. 77,
  1467. 11
  1468. );
  1469. mfn(
  1470. 77,
  1471. 11
  1472. ).done(
  1473. delay(
  1474. function (
  1475. res
  1476. ) {
  1477. a(
  1478. res,
  1479. 88,
  1480. "Result D #4"
  1481. );
  1482. a(
  1483. i,
  1484. 9,
  1485. "Called D #4"
  1486. );
  1487. mfn.clear();
  1488. mfn(
  1489. 5,
  1490. 8
  1491. ).done(
  1492. delay(
  1493. function (
  1494. res
  1495. ) {
  1496. a(
  1497. res,
  1498. 13,
  1499. "Result B #6"
  1500. );
  1501. a(
  1502. i,
  1503. 10,
  1504. "Called B #6"
  1505. );
  1506. mfn(
  1507. 77,
  1508. 11
  1509. ).done(
  1510. delay(
  1511. function (
  1512. res
  1513. ) {
  1514. a(
  1515. res,
  1516. 88,
  1517. "Result D #5"
  1518. );
  1519. a(
  1520. i,
  1521. 11,
  1522. "Called D #5"
  1523. );
  1524. d();
  1525. }
  1526. )
  1527. );
  1528. }
  1529. )
  1530. );
  1531. }
  1532. )
  1533. );
  1534. }
  1535. )
  1536. );
  1537. }
  1538. )
  1539. );
  1540. }
  1541. )
  1542. );
  1543. }
  1544. )
  1545. );
  1546. }
  1547. )
  1548. );
  1549. }
  1550. )
  1551. );
  1552. }
  1553. )
  1554. );
  1555. })
  1556. );
  1557. })
  1558. );
  1559. })
  1560. );
  1561. })
  1562. );
  1563. })
  1564. );
  1565. })
  1566. );
  1567. })
  1568. );
  1569. })
  1570. );
  1571. })
  1572. );
  1573. }
  1574. }
  1575. };
  1576. };