| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677 | /* eslint id-length: 0, max-lines: 0, max-statements: 0, max-nested-callbacks: 0, no-shadow: 0, max-len: 0 */"use strict";var memoize  = require("../..")  , nextTick = require("next-tick")  , delay    = require("timers-ext/delay")  , Promise  = require("plain-promise");module.exports = function () {	return {		Regular: {			Sync: function (a) {				var mfn,					fn,					i = 0;				fn = function (x, y) {					++i;					return x + y;				};				mfn = memoize(fn, { max: 3 });				a(mfn(3, 7), 10, "Result #1");				a(i, 1, "Called #1");				a(mfn(3, 7), 10, "Result #2");				a(i, 1, "Called #2");				a(mfn(5, 8), 13, "Result B #1");				a(i, 2, "Called B #1");				a(mfn(3, 7), 10, "Result #3");				a(i, 2, "Called #3");				a(mfn(5, 8), 13, "Result B #2");				a(i, 2, "Called B #2");				a(mfn(12, 4), 16, "Result C #1");				a(i, 3, "Called C #1");				a(mfn(3, 7), 10, "Result #4");				a(i, 3, "Called #4");				a(mfn(5, 8), 13, "Result B #3");				a(i, 3, "Called B #3");				a(mfn(77, 11), 88, "Result D #1"); // Delete 12, 4				a(i, 4, "Called D #1");				a(mfn(5, 8), 13, "Result B #4");				a(i, 4, "Called B #4");				a(mfn(12, 4), 16, "Result C #2"); // Delete 3, 7				a(i, 5, "Called C #2");				a(mfn(3, 7), 10, "Result #5"); // Delete 77, 11				a(i, 6, "Called #5");				a(mfn(77, 11), 88, "Result D #2"); // Delete 5, 8				a(i, 7, "Called D #2");				a(mfn(12, 4), 16, "Result C #3");				a(i, 7, "Called C #3");				a(mfn(5, 8), 13, "Result B #5"); // Delete 3, 7				a(i, 8, "Called B #5");				a(mfn(77, 11), 88, "Result D #3");				a(i, 8, "Called D #3");				mfn.delete(77, 11);				a(mfn(77, 11), 88, "Result D #4");				a(i, 9, "Called D #4");				mfn.clear();				a(mfn(5, 8), 13, "Result B #6");				a(i, 10, "Called B #6");				a(mfn(77, 11), 88, "Result D #5");				a(i, 11, "Called D #5");			},			Async: function (a, d) {				var mfn,					fn,					u = {},					i = 0;				fn = function (x, y, cb) {					nextTick(function () {						++i;						cb(null, x + y);					});					return u;				};				mfn = memoize(fn, { async: true, max: 3 });				a(					mfn(3, 7, function (err, res) {						a.deep([err, res], [null, 10], "Result #1");						a(i, 1, "Called #1");						a(							mfn(3, 7, function (err, res) {								a.deep([err, res], [null, 10], "Result #2");								a(i, 1, "Called #2");								a(									mfn(5, 8, function (err, res) {										a.deep([err, res], [null, 13], "Result B #1");										a(i, 2, "Called B #1");										a(											mfn(3, 7, function (err, res) {												a.deep([err, res], [null, 10], "Result #3");												a(i, 2, "Called #3");												a(													mfn(5, 8, function (err, res) {														a.deep(															[err, res],															[null, 13],															"Result B #2"														);														a(i, 2, "Called B #2");														a(															mfn(12, 4, function (err, res) {																a.deep(																	[err, res],																	[null, 16],																	"Result C #1"																);																a(i, 3, "Called C #1");																a(																	mfn(3, 7, function (err, res) {																		a.deep(																			[err, res],																			[null, 10],																			"Result #4"																		);																		a(i, 3, "Called #4");																		a(																			mfn(5, 8, function (																				err,																				res																			) {																				a.deep(																					[err, res],																					[null, 13],																					"Result B #3"																				);																				a(																					i,																					3,																					"Called B #3"																				);																				a(																					mfn(																						77,																						11,																						function (																							err,																							res																						) {																							a.deep(																								[																									err,																									res																								],																								[																									null,																									88																								],																								"Result D #1"																							);																							a(																								i,																								4,																								"Called D #1"																							);																							a(																								mfn(																									5,																									8,																									function (																										err,																										res																									) {																										a.deep(																											[																												err,																												res																											],																											[																												null,																												13																											],																											"Result B #4"																										);																										a(																											i,																											4,																											"Called B #4"																										);																										a(																											mfn(																												12,																												4,																												function (																													err,																													res																												) {																													a.deep(																														[																															err,																															res																														],																														[																															null,																															16																														],																														"Result C #2"																													);																													a(																														i,																														5,																														"Called C #2"																													);																													a(																														mfn(																															3,																															7,																															function (																																err,																																res																															) {																																a.deep(																																	[																																		err,																																		res																																	],																																	[																																		null,																																		10																																	],																																	"Result #5"																																);																																a(																																	i,																																	6,																																	"Called #5"																																);																																a(																																	mfn(																																		77,																																		11,																																		function (																																			err,																																			res																																		) {																																			a.deep(																																				[																																					err,																																					res																																				],																																				[																																					null,																																					88																																				],																																				"Result D #2"																																			);																																			a(																																				i,																																				7,																																				"Called D #2"																																			);																																			a(																																				mfn(																																					12,																																					4,																																					function (																																						err,																																						res																																					) {																																						a.deep(																																							[																																								err,																																								res																																							],																																							[																																								null,																																								16																																							],																																							"Result C #3"																																						);																																						a(																																							i,																																							7,																																							"Called C #3"																																						);																																						a(																																							mfn(																																								5,																																								8,																																								function (																																									err,																																									res																																								) {																																									a.deep(																																										[																																											err,																																											res																																										],																																										[																																											null,																																											13																																										],																																										"Result B #5"																																									);																																									a(																																										i,																																										8,																																										"Called B #5"																																									);																																									a(																																										mfn(																																											77,																																											11,																																											function (																																												err,																																												res																																											) {																																												a.deep(																																													[																																														err,																																														res																																													],																																													[																																														null,																																														88																																													],																																													"Result D #3"																																												);																																												a(																																													i,																																													8,																																													"Called D #3"																																												);																																												mfn.delete(																																													77,																																													11																																												);																																												a(																																													mfn(																																														77,																																														11,																																														function (																																															err,																																															res																																														) {																																															a.deep(																																																[																																																	err,																																																	res																																																],																																																[																																																	null,																																																	88																																																],																																																"Result D #4"																																															);																																															a(																																																i,																																																9,																																																"Called D #4"																																															);																																															mfn.clear();																																															a(																																																mfn(																																																	5,																																																	8,																																																	function (																																																		err,																																																		res																																																	) {																																																		a.deep(																																																			[																																																				err,																																																				res																																																			],																																																			[																																																				null,																																																				13																																																			],																																																			"Result B #6"																																																		);																																																		a(																																																			i,																																																			10,																																																			"Called B #6"																																																		);																																																		a(																																																			mfn(																																																				77,																																																				11,																																																				function (																																																					err,																																																					res																																																				) {																																																					a.deep(																																																						[																																																							err,																																																							res																																																						],																																																						[																																																							null,																																																							88																																																						],																																																						"Result D #5"																																																					);																																																					a(																																																						i,																																																						11,																																																						"Called D #5"																																																					);																																																					d();																																																				}																																																			),																																																			u,																																																			"Initial D #5"																																																		);																																																	}																																																),																																																u,																																																"Initial B #6"																																															);																																														}																																													),																																													u,																																													"Initial D #4"																																												);																																											}																																										),																																										u,																																										"Initial D #3"																																									);																																								}																																							),																																							u,																																							"Initial B #5"																																						);																																					}																																				),																																				u,																																				"Initial C #3"																																			);																																		}																																	),																																	u,																																	"Initial D #2"																																);																															}																														),																														u,																														"Initial #5"																													);																												}																											),																											u,																											"Initial C #2"																										);																									}																								),																								u,																								"Initial B #4"																							);																						}																					),																					u,																					"Initial D #1"																				);																			}),																			u,																			"Initial B #3"																		);																	}),																	u,																	"Initial #4"																);															}),															u,															"Initial C #1"														);													}),													u,													"Initial B #2"												);											}),											u,											"Initial #3"										);									}),									u,									"Initial B #1"								);							}),							u,							"Initial #2"						);					}),					u,					"Initial #1"				);			},			Promise: function (a, d) {				var mfn,					fn,					i = 0;				fn = function (x, y) {					++i;					return new Promise(function (res) {						res(x + y);					});				};				mfn = memoize(fn, { promise: true, max: 3 });				mfn(3, 7).done(					delay(function (res) {						// [3,7]						a(res, 10, "Result #1");						a(i, 1, "Called #1");						mfn(3, 7).done(							delay(function (res) {								a(res, 10, "Result #2");								a(i, 1, "Called #2");								mfn(5, 8).done(									delay(function (res) {										// [3,7], [5,8]										a(res, 13, "Result B #1");										a(i, 2, "Called B #1");										mfn(3, 7).done(											delay(function (res) {												// [5,8], [3, 7]												a(res, 10, "Result #3");												a(i, 2, "Called #3");												mfn(5, 8).done(													delay(function (res) {														// [3,7], [5,8]														a(res, 13, "Result B #2");														a(i, 2, "Called B #2");														mfn(12, 4).done(															delay(function (res) {																// [3,7], [5,8], [12, 4]																a(res, 16, "Result C #1");																a(i, 3, "Called C #1");																mfn(3, 7).done(																	delay(function (res) {																		// [5,8], [12, 4], [3, 7]																		a(res, 10, "Result #4");																		a(i, 3, "Called #4");																		mfn(5, 8).done(																			delay(function (res) {																				// [12, 4], [3, 7], [5, 8]																				a(																					res,																					13,																					"Result B #3"																				);																				a(																					i,																					3,																					"Called B #3"																				);																				mfn(77, 11).done(																					delay(function (																						res																					) {																						// [3, 7], [5, 8], [77, 11]																						a(																							res,																							88,																							"Result D #1"																						);																						a(																							i,																							4,																							"Called D #1"																						);																						mfn(																							5,																							8																						).done(																							delay(																								function (																									res																								) {																									// [3, 7], [77, 11], [5, 8]																									a(																										res,																										13,																										"Result B #4"																									);																									a(																										i,																										4,																										"Called B #4"																									);																									mfn(																										12,																										4																									).done(																										delay(																											function (																												res																											) {																												// [77, 11], [5, 8], [12, 4]																												a(																													res,																													16,																													"Result C #2"																												);																												a(																													i,																													5,																													"Called C #2"																												);																												mfn(																													3,																													7																												).done(																													delay(																														function (																															res																														) {																															a(																																res,																																10,																																"Result #5"																															);																															a(																																i,																																6,																																"Called #5"																															);																															mfn(																																77,																																11																															).done(																																delay(																																	function (																																		res																																	) {																																		a(																																			res,																																			88,																																			"Result D #2"																																		);																																		a(																																			i,																																			7,																																			"Called D #2"																																		);																																		mfn(																																			12,																																			4																																		).done(																																			delay(																																				function (																																					res																																				) {																																					a(																																						res,																																						16,																																						"Result C #3"																																					);																																					a(																																						i,																																						7,																																						"Called C #3"																																					);																																					mfn(																																						5,																																						8																																					).done(																																						delay(																																							function (																																								res																																							) {																																								a(																																									res,																																									13,																																									"Result B #5"																																								);																																								a(																																									i,																																									8,																																									"Called B #5"																																								);																																								mfn(																																									77,																																									11																																								).done(																																									delay(																																										function (																																											res																																										) {																																											a(																																												res,																																												88,																																												"Result D #3"																																											);																																											a(																																												i,																																												8,																																												"Called D #3"																																											);																																											mfn.delete(																																												77,																																												11																																											);																																											mfn(																																												77,																																												11																																											).done(																																												delay(																																													function (																																														res																																													) {																																														a(																																															res,																																															88,																																															"Result D #4"																																														);																																														a(																																															i,																																															9,																																															"Called D #4"																																														);																																														mfn.clear();																																														mfn(																																															5,																																															8																																														).done(																																															delay(																																																function (																																																	res																																																) {																																																	a(																																																		res,																																																		13,																																																		"Result B #6"																																																	);																																																	a(																																																		i,																																																		10,																																																		"Called B #6"																																																	);																																																	mfn(																																																		77,																																																		11																																																	).done(																																																		delay(																																																			function (																																																				res																																																			) {																																																				a(																																																					res,																																																					88,																																																					"Result D #5"																																																				);																																																				a(																																																					i,																																																					11,																																																					"Called D #5"																																																				);																																																				d();																																																			}																																																		)																																																	);																																																}																																															)																																														);																																													}																																												)																																											);																																										}																																									)																																								);																																							}																																						)																																					);																																				}																																			)																																		);																																	}																																)																															);																														}																													)																												);																											}																										)																									);																								}																							)																						);																					})																				);																			})																		);																	})																);															})														);													})												);											})										);									})								);							})						);					})				);			}		},		Primitive: {			Sync: function (a) {				var mfn,					fn,					i = 0;				fn = function (x, y) {					++i;					return x + y;				};				mfn = memoize(fn, { primitive: true, max: 3 });				a(mfn(3, 7), 10, "Result #1");				a(i, 1, "Called #1");				a(mfn(3, 7), 10, "Result #2");				a(i, 1, "Called #2");				a(mfn(5, 8), 13, "Result B #1");				a(i, 2, "Called B #1");				a(mfn(3, 7), 10, "Result #3");				a(i, 2, "Called #3");				a(mfn(5, 8), 13, "Result B #2");				a(i, 2, "Called B #2");				a(mfn(12, 4), 16, "Result C #1");				a(i, 3, "Called C #1");				a(mfn(3, 7), 10, "Result #4");				a(i, 3, "Called #4");				a(mfn(5, 8), 13, "Result B #3");				a(i, 3, "Called B #3");				a(mfn(77, 11), 88, "Result D #1"); // Delete 12, 4				a(i, 4, "Called D #1");				a(mfn(5, 8), 13, "Result B #4");				a(i, 4, "Called B #4");				a(mfn(12, 4), 16, "Result C #2"); // Delete 3, 7				a(i, 5, "Called C #2");				a(mfn(3, 7), 10, "Result #5"); // Delete 77, 11				a(i, 6, "Called #5");				a(mfn(77, 11), 88, "Result D #2"); // Delete 5, 8				a(i, 7, "Called D #2");				a(mfn(12, 4), 16, "Result C #3");				a(i, 7, "Called C #3");				a(mfn(5, 8), 13, "Result B #5"); // Delete 3, 7				a(i, 8, "Called B #5");				a(mfn(77, 11), 88, "Result D #3");				a(i, 8, "Called D #3");				mfn.delete(77, 11);				a(mfn(77, 11), 88, "Result D #4");				a(i, 9, "Called D #4");				mfn.clear();				a(mfn(5, 8), 13, "Result B #6");				a(i, 10, "Called B #6");				a(mfn(77, 11), 88, "Result D #5");				a(i, 11, "Called D #5");			},			Async: function (a, d) {				var mfn,					fn,					u = {},					i = 0;				fn = function (x, y, cb) {					nextTick(function () {						++i;						cb(null, x + y);					});					return u;				};				mfn = memoize(fn, { async: true, primitive: true, max: 3 });				a(					mfn(3, 7, function (err, res) {						a.deep([err, res], [null, 10], "Result #1");						a(i, 1, "Called #1");						a(							mfn(3, 7, function (err, res) {								a.deep([err, res], [null, 10], "Result #2");								a(i, 1, "Called #2");								a(									mfn(5, 8, function (err, res) {										a.deep([err, res], [null, 13], "Result B #1");										a(i, 2, "Called B #1");										a(											mfn(3, 7, function (err, res) {												a.deep([err, res], [null, 10], "Result #3");												a(i, 2, "Called #3");												a(													mfn(5, 8, function (err, res) {														a.deep(															[err, res],															[null, 13],															"Result B #2"														);														a(i, 2, "Called B #2");														a(															mfn(12, 4, function (err, res) {																a.deep(																	[err, res],																	[null, 16],																	"Result C #1"																);																a(i, 3, "Called C #1");																a(																	mfn(3, 7, function (err, res) {																		a.deep(																			[err, res],																			[null, 10],																			"Result #4"																		);																		a(i, 3, "Called #4");																		a(																			mfn(5, 8, function (																				err,																				res																			) {																				a.deep(																					[err, res],																					[null, 13],																					"Result B #3"																				);																				a(																					i,																					3,																					"Called B #3"																				);																				a(																					mfn(																						77,																						11,																						function (																							err,																							res																						) {																							a.deep(																								[																									err,																									res																								],																								[																									null,																									88																								],																								"Result D #1"																							);																							a(																								i,																								4,																								"Called D #1"																							);																							a(																								mfn(																									5,																									8,																									function (																										err,																										res																									) {																										a.deep(																											[																												err,																												res																											],																											[																												null,																												13																											],																											"Result B #4"																										);																										a(																											i,																											4,																											"Called B #4"																										);																										a(																											mfn(																												12,																												4,																												function (																													err,																													res																												) {																													a.deep(																														[																															err,																															res																														],																														[																															null,																															16																														],																														"Result C #2"																													);																													a(																														i,																														5,																														"Called C #2"																													);																													a(																														mfn(																															3,																															7,																															function (																																err,																																res																															) {																																a.deep(																																	[																																		err,																																		res																																	],																																	[																																		null,																																		10																																	],																																	"Result #5"																																);																																a(																																	i,																																	6,																																	"Called #5"																																);																																a(																																	mfn(																																		77,																																		11,																																		function (																																			err,																																			res																																		) {																																			a.deep(																																				[																																					err,																																					res																																				],																																				[																																					null,																																					88																																				],																																				"Result D #2"																																			);																																			a(																																				i,																																				7,																																				"Called D #2"																																			);																																			a(																																				mfn(																																					12,																																					4,																																					function (																																						err,																																						res																																					) {																																						a.deep(																																							[																																								err,																																								res																																							],																																							[																																								null,																																								16																																							],																																							"Result C #3"																																						);																																						a(																																							i,																																							7,																																							"Called C #3"																																						);																																						a(																																							mfn(																																								5,																																								8,																																								function (																																									err,																																									res																																								) {																																									a.deep(																																										[																																											err,																																											res																																										],																																										[																																											null,																																											13																																										],																																										"Result B #5"																																									);																																									a(																																										i,																																										8,																																										"Called B #5"																																									);																																									a(																																										mfn(																																											77,																																											11,																																											function (																																												err,																																												res																																											) {																																												a.deep(																																													[																																														err,																																														res																																													],																																													[																																														null,																																														88																																													],																																													"Result D #3"																																												);																																												a(																																													i,																																													8,																																													"Called D #3"																																												);																																												mfn.delete(																																													77,																																													11																																												);																																												a(																																													mfn(																																														77,																																														11,																																														function (																																															err,																																															res																																														) {																																															a.deep(																																																[																																																	err,																																																	res																																																],																																																[																																																	null,																																																	88																																																],																																																"Result D #4"																																															);																																															a(																																																i,																																																9,																																																"Called D #4"																																															);																																															mfn.clear();																																															a(																																																mfn(																																																	5,																																																	8,																																																	function (																																																		err,																																																		res																																																	) {																																																		a.deep(																																																			[																																																				err,																																																				res																																																			],																																																			[																																																				null,																																																				13																																																			],																																																			"Result B #6"																																																		);																																																		a(																																																			i,																																																			10,																																																			"Called B #6"																																																		);																																																		a(																																																			mfn(																																																				77,																																																				11,																																																				function (																																																					err,																																																					res																																																				) {																																																					a.deep(																																																						[																																																							err,																																																							res																																																						],																																																						[																																																							null,																																																							88																																																						],																																																						"Result D #5"																																																					);																																																					a(																																																						i,																																																						11,																																																						"Called D #5"																																																					);																																																					d();																																																				}																																																			),																																																			u,																																																			"Initial D #5"																																																		);																																																	}																																																),																																																u,																																																"Initial B #6"																																															);																																														}																																													),																																													u,																																													"Initial D #4"																																												);																																											}																																										),																																										u,																																										"Initial D #3"																																									);																																								}																																							),																																							u,																																							"Initial B #5"																																						);																																					}																																				),																																				u,																																				"Initial C #3"																																			);																																		}																																	),																																	u,																																	"Initial D #2"																																);																															}																														),																														u,																														"Initial #5"																													);																												}																											),																											u,																											"Initial C #2"																										);																									}																								),																								u,																								"Initial B #4"																							);																						}																					),																					u,																					"Initial D #1"																				);																			}),																			u,																			"Initial B #3"																		);																	}),																	u,																	"Initial #4"																);															}),															u,															"Initial C #1"														);													}),													u,													"Initial B #2"												);											}),											u,											"Initial #3"										);									}),									u,									"Initial B #1"								);							}),							u,							"Initial #2"						);					}),					u,					"Initial #1"				);			},			Promise: function (a, d) {				var mfn,					fn,					i = 0;				fn = function (x, y) {					++i;					return new Promise(function (res) {						res(x + y);					});				};				mfn = memoize(fn, { promise: true, primitive: true, max: 3 });				mfn(3, 7).done(					delay(function (res) {						a(res, 10, "Result #1");						a(i, 1, "Called #1");						mfn(3, 7).done(							delay(function (res) {								a(res, 10, "Result #2");								a(i, 1, "Called #2");								mfn(5, 8).done(									delay(function (res) {										a(res, 13, "Result B #1");										a(i, 2, "Called B #1");										mfn(3, 7).done(											delay(function (res) {												a(res, 10, "Result #3");												a(i, 2, "Called #3");												mfn(5, 8).done(													delay(function (res) {														a(res, 13, "Result B #2");														a(i, 2, "Called B #2");														mfn(12, 4).done(															delay(function (res) {																a(res, 16, "Result C #1");																a(i, 3, "Called C #1");																mfn(3, 7).done(																	delay(function (res) {																		a(res, 10, "Result #4");																		a(i, 3, "Called #4");																		mfn(5, 8).done(																			delay(function (res) {																				a(																					res,																					13,																					"Result B #3"																				);																				a(																					i,																					3,																					"Called B #3"																				);																				mfn(77, 11).done(																					delay(function (																						res																					) {																						a(																							res,																							88,																							"Result D #1"																						);																						a(																							i,																							4,																							"Called D #1"																						);																						mfn(																							5,																							8																						).done(																							delay(																								function (																									res																								) {																									a(																										res,																										13,																										"Result B #4"																									);																									a(																										i,																										4,																										"Called B #4"																									);																									mfn(																										12,																										4																									).done(																										delay(																											function (																												res																											) {																												a(																													res,																													16,																													"Result C #2"																												);																												a(																													i,																													5,																													"Called C #2"																												);																												mfn(																													3,																													7																												).done(																													delay(																														function (																															res																														) {																															a(																																res,																																10,																																"Result #5"																															);																															a(																																i,																																6,																																"Called #5"																															);																															mfn(																																77,																																11																															).done(																																delay(																																	function (																																		res																																	) {																																		a(																																			res,																																			88,																																			"Result D #2"																																		);																																		a(																																			i,																																			7,																																			"Called D #2"																																		);																																		mfn(																																			12,																																			4																																		).done(																																			delay(																																				function (																																					res																																				) {																																					a(																																						res,																																						16,																																						"Result C #3"																																					);																																					a(																																						i,																																						7,																																						"Called C #3"																																					);																																					mfn(																																						5,																																						8																																					).done(																																						delay(																																							function (																																								res																																							) {																																								a(																																									res,																																									13,																																									"Result B #5"																																								);																																								a(																																									i,																																									8,																																									"Called B #5"																																								);																																								mfn(																																									77,																																									11																																								).done(																																									delay(																																										function (																																											res																																										) {																																											a(																																												res,																																												88,																																												"Result D #3"																																											);																																											a(																																												i,																																												8,																																												"Called D #3"																																											);																																											mfn.delete(																																												77,																																												11																																											);																																											mfn(																																												77,																																												11																																											).done(																																												delay(																																													function (																																														res																																													) {																																														a(																																															res,																																															88,																																															"Result D #4"																																														);																																														a(																																															i,																																															9,																																															"Called D #4"																																														);																																														mfn.clear();																																														mfn(																																															5,																																															8																																														).done(																																															delay(																																																function (																																																	res																																																) {																																																	a(																																																		res,																																																		13,																																																		"Result B #6"																																																	);																																																	a(																																																		i,																																																		10,																																																		"Called B #6"																																																	);																																																	mfn(																																																		77,																																																		11																																																	).done(																																																		delay(																																																			function (																																																				res																																																			) {																																																				a(																																																					res,																																																					88,																																																					"Result D #5"																																																				);																																																				a(																																																					i,																																																					11,																																																					"Called D #5"																																																				);																																																				d();																																																			}																																																		)																																																	);																																																}																																															)																																														);																																													}																																												)																																											);																																										}																																									)																																								);																																							}																																						)																																					);																																				}																																			)																																		);																																	}																																)																															);																														}																													)																												);																											}																										)																									);																								}																							)																						);																					})																				);																			})																		);																	})																);															})														);													})												);											})										);									})								);							})						);					})				);			}		}	};};
 |