async-rails 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jason Chen
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # async-rails
2
+
3
+ Rails asset pipeline wrapper for [async.js](https://github.com/caolan/async).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'async-rails'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install async-rails
18
+
19
+ ## Usage
20
+
21
+ Include async in your manifest files:
22
+
23
+ //= require async
@@ -0,0 +1,8 @@
1
+ require "async-rails/version"
2
+
3
+ module Async
4
+ module Rails
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module Async
2
+ module Rails
3
+ VERSION = "0.2.5"
4
+ end
5
+ end
@@ -0,0 +1,955 @@
1
+ /*global setImmediate: false, setTimeout: false, console: false */
2
+ (function () {
3
+
4
+ var async = {};
5
+
6
+ // global on the server, window in the browser
7
+ var root, previous_async;
8
+
9
+ root = this;
10
+ if (root != null) {
11
+ previous_async = root.async;
12
+ }
13
+
14
+ async.noConflict = function () {
15
+ root.async = previous_async;
16
+ return async;
17
+ };
18
+
19
+ function only_once(fn) {
20
+ var called = false;
21
+ return function() {
22
+ if (called) throw new Error("Callback was already called.");
23
+ called = true;
24
+ fn.apply(root, arguments);
25
+ }
26
+ }
27
+
28
+ //// cross-browser compatiblity functions ////
29
+
30
+ var _each = function (arr, iterator) {
31
+ if (arr.forEach) {
32
+ return arr.forEach(iterator);
33
+ }
34
+ for (var i = 0; i < arr.length; i += 1) {
35
+ iterator(arr[i], i, arr);
36
+ }
37
+ };
38
+
39
+ var _map = function (arr, iterator) {
40
+ if (arr.map) {
41
+ return arr.map(iterator);
42
+ }
43
+ var results = [];
44
+ _each(arr, function (x, i, a) {
45
+ results.push(iterator(x, i, a));
46
+ });
47
+ return results;
48
+ };
49
+
50
+ var _reduce = function (arr, iterator, memo) {
51
+ if (arr.reduce) {
52
+ return arr.reduce(iterator, memo);
53
+ }
54
+ _each(arr, function (x, i, a) {
55
+ memo = iterator(memo, x, i, a);
56
+ });
57
+ return memo;
58
+ };
59
+
60
+ var _keys = function (obj) {
61
+ if (Object.keys) {
62
+ return Object.keys(obj);
63
+ }
64
+ var keys = [];
65
+ for (var k in obj) {
66
+ if (obj.hasOwnProperty(k)) {
67
+ keys.push(k);
68
+ }
69
+ }
70
+ return keys;
71
+ };
72
+
73
+ //// exported async module functions ////
74
+
75
+ //// nextTick implementation with browser-compatible fallback ////
76
+ if (typeof process === 'undefined' || !(process.nextTick)) {
77
+ if (typeof setImmediate === 'function') {
78
+ async.nextTick = function (fn) {
79
+ setImmediate(fn);
80
+ };
81
+ }
82
+ else {
83
+ async.nextTick = function (fn) {
84
+ setTimeout(fn, 0);
85
+ };
86
+ }
87
+ }
88
+ else {
89
+ async.nextTick = process.nextTick;
90
+ }
91
+
92
+ async.each = function (arr, iterator, callback) {
93
+ callback = callback || function () {};
94
+ if (!arr.length) {
95
+ return callback();
96
+ }
97
+ var completed = 0;
98
+ _each(arr, function (x) {
99
+ iterator(x, only_once(function (err) {
100
+ if (err) {
101
+ callback(err);
102
+ callback = function () {};
103
+ }
104
+ else {
105
+ completed += 1;
106
+ if (completed >= arr.length) {
107
+ callback(null);
108
+ }
109
+ }
110
+ }));
111
+ });
112
+ };
113
+ async.forEach = async.each;
114
+
115
+ async.eachSeries = function (arr, iterator, callback) {
116
+ callback = callback || function () {};
117
+ if (!arr.length) {
118
+ return callback();
119
+ }
120
+ var completed = 0;
121
+ var iterate = function () {
122
+ var sync = true;
123
+ iterator(arr[completed], function (err) {
124
+ if (err) {
125
+ callback(err);
126
+ callback = function () {};
127
+ }
128
+ else {
129
+ completed += 1;
130
+ if (completed >= arr.length) {
131
+ callback(null);
132
+ }
133
+ else {
134
+ if (sync) {
135
+ async.nextTick(iterate);
136
+ }
137
+ else {
138
+ iterate();
139
+ }
140
+ }
141
+ }
142
+ });
143
+ sync = false;
144
+ };
145
+ iterate();
146
+ };
147
+ async.forEachSeries = async.eachSeries;
148
+
149
+ async.eachLimit = function (arr, limit, iterator, callback) {
150
+ var fn = _eachLimit(limit);
151
+ fn.apply(null, [arr, iterator, callback]);
152
+ };
153
+ async.forEachLimit = async.eachLimit;
154
+
155
+ var _eachLimit = function (limit) {
156
+
157
+ return function (arr, iterator, callback) {
158
+ callback = callback || function () {};
159
+ if (!arr.length || limit <= 0) {
160
+ return callback();
161
+ }
162
+ var completed = 0;
163
+ var started = 0;
164
+ var running = 0;
165
+
166
+ (function replenish () {
167
+ if (completed >= arr.length) {
168
+ return callback();
169
+ }
170
+
171
+ while (running < limit && started < arr.length) {
172
+ started += 1;
173
+ running += 1;
174
+ iterator(arr[started - 1], function (err) {
175
+ if (err) {
176
+ callback(err);
177
+ callback = function () {};
178
+ }
179
+ else {
180
+ completed += 1;
181
+ running -= 1;
182
+ if (completed >= arr.length) {
183
+ callback();
184
+ }
185
+ else {
186
+ replenish();
187
+ }
188
+ }
189
+ });
190
+ }
191
+ })();
192
+ };
193
+ };
194
+
195
+
196
+ var doParallel = function (fn) {
197
+ return function () {
198
+ var args = Array.prototype.slice.call(arguments);
199
+ return fn.apply(null, [async.each].concat(args));
200
+ };
201
+ };
202
+ var doParallelLimit = function(limit, fn) {
203
+ return function () {
204
+ var args = Array.prototype.slice.call(arguments);
205
+ return fn.apply(null, [_eachLimit(limit)].concat(args));
206
+ };
207
+ };
208
+ var doSeries = function (fn) {
209
+ return function () {
210
+ var args = Array.prototype.slice.call(arguments);
211
+ return fn.apply(null, [async.eachSeries].concat(args));
212
+ };
213
+ };
214
+
215
+
216
+ var _asyncMap = function (eachfn, arr, iterator, callback) {
217
+ var results = [];
218
+ arr = _map(arr, function (x, i) {
219
+ return {index: i, value: x};
220
+ });
221
+ eachfn(arr, function (x, callback) {
222
+ iterator(x.value, function (err, v) {
223
+ results[x.index] = v;
224
+ callback(err);
225
+ });
226
+ }, function (err) {
227
+ callback(err, results);
228
+ });
229
+ };
230
+ async.map = doParallel(_asyncMap);
231
+ async.mapSeries = doSeries(_asyncMap);
232
+ async.mapLimit = function (arr, limit, iterator, callback) {
233
+ return _mapLimit(limit)(arr, iterator, callback);
234
+ };
235
+
236
+ var _mapLimit = function(limit) {
237
+ return doParallelLimit(limit, _asyncMap);
238
+ };
239
+
240
+ // reduce only has a series version, as doing reduce in parallel won't
241
+ // work in many situations.
242
+ async.reduce = function (arr, memo, iterator, callback) {
243
+ async.eachSeries(arr, function (x, callback) {
244
+ iterator(memo, x, function (err, v) {
245
+ memo = v;
246
+ callback(err);
247
+ });
248
+ }, function (err) {
249
+ callback(err, memo);
250
+ });
251
+ };
252
+ // inject alias
253
+ async.inject = async.reduce;
254
+ // foldl alias
255
+ async.foldl = async.reduce;
256
+
257
+ async.reduceRight = function (arr, memo, iterator, callback) {
258
+ var reversed = _map(arr, function (x) {
259
+ return x;
260
+ }).reverse();
261
+ async.reduce(reversed, memo, iterator, callback);
262
+ };
263
+ // foldr alias
264
+ async.foldr = async.reduceRight;
265
+
266
+ var _filter = function (eachfn, arr, iterator, callback) {
267
+ var results = [];
268
+ arr = _map(arr, function (x, i) {
269
+ return {index: i, value: x};
270
+ });
271
+ eachfn(arr, function (x, callback) {
272
+ iterator(x.value, function (v) {
273
+ if (v) {
274
+ results.push(x);
275
+ }
276
+ callback();
277
+ });
278
+ }, function (err) {
279
+ callback(_map(results.sort(function (a, b) {
280
+ return a.index - b.index;
281
+ }), function (x) {
282
+ return x.value;
283
+ }));
284
+ });
285
+ };
286
+ async.filter = doParallel(_filter);
287
+ async.filterSeries = doSeries(_filter);
288
+ // select alias
289
+ async.select = async.filter;
290
+ async.selectSeries = async.filterSeries;
291
+
292
+ var _reject = function (eachfn, arr, iterator, callback) {
293
+ var results = [];
294
+ arr = _map(arr, function (x, i) {
295
+ return {index: i, value: x};
296
+ });
297
+ eachfn(arr, function (x, callback) {
298
+ iterator(x.value, function (v) {
299
+ if (!v) {
300
+ results.push(x);
301
+ }
302
+ callback();
303
+ });
304
+ }, function (err) {
305
+ callback(_map(results.sort(function (a, b) {
306
+ return a.index - b.index;
307
+ }), function (x) {
308
+ return x.value;
309
+ }));
310
+ });
311
+ };
312
+ async.reject = doParallel(_reject);
313
+ async.rejectSeries = doSeries(_reject);
314
+
315
+ var _detect = function (eachfn, arr, iterator, main_callback) {
316
+ eachfn(arr, function (x, callback) {
317
+ iterator(x, function (result) {
318
+ if (result) {
319
+ main_callback(x);
320
+ main_callback = function () {};
321
+ }
322
+ else {
323
+ callback();
324
+ }
325
+ });
326
+ }, function (err) {
327
+ main_callback();
328
+ });
329
+ };
330
+ async.detect = doParallel(_detect);
331
+ async.detectSeries = doSeries(_detect);
332
+
333
+ async.some = function (arr, iterator, main_callback) {
334
+ async.each(arr, function (x, callback) {
335
+ iterator(x, function (v) {
336
+ if (v) {
337
+ main_callback(true);
338
+ main_callback = function () {};
339
+ }
340
+ callback();
341
+ });
342
+ }, function (err) {
343
+ main_callback(false);
344
+ });
345
+ };
346
+ // any alias
347
+ async.any = async.some;
348
+
349
+ async.every = function (arr, iterator, main_callback) {
350
+ async.each(arr, function (x, callback) {
351
+ iterator(x, function (v) {
352
+ if (!v) {
353
+ main_callback(false);
354
+ main_callback = function () {};
355
+ }
356
+ callback();
357
+ });
358
+ }, function (err) {
359
+ main_callback(true);
360
+ });
361
+ };
362
+ // all alias
363
+ async.all = async.every;
364
+
365
+ async.sortBy = function (arr, iterator, callback) {
366
+ async.map(arr, function (x, callback) {
367
+ iterator(x, function (err, criteria) {
368
+ if (err) {
369
+ callback(err);
370
+ }
371
+ else {
372
+ callback(null, {value: x, criteria: criteria});
373
+ }
374
+ });
375
+ }, function (err, results) {
376
+ if (err) {
377
+ return callback(err);
378
+ }
379
+ else {
380
+ var fn = function (left, right) {
381
+ var a = left.criteria, b = right.criteria;
382
+ return a < b ? -1 : a > b ? 1 : 0;
383
+ };
384
+ callback(null, _map(results.sort(fn), function (x) {
385
+ return x.value;
386
+ }));
387
+ }
388
+ });
389
+ };
390
+
391
+ async.auto = function (tasks, callback) {
392
+ callback = callback || function () {};
393
+ var keys = _keys(tasks);
394
+ if (!keys.length) {
395
+ return callback(null);
396
+ }
397
+
398
+ var results = {};
399
+
400
+ var listeners = [];
401
+ var addListener = function (fn) {
402
+ listeners.unshift(fn);
403
+ };
404
+ var removeListener = function (fn) {
405
+ for (var i = 0; i < listeners.length; i += 1) {
406
+ if (listeners[i] === fn) {
407
+ listeners.splice(i, 1);
408
+ return;
409
+ }
410
+ }
411
+ };
412
+ var taskComplete = function () {
413
+ _each(listeners.slice(0), function (fn) {
414
+ fn();
415
+ });
416
+ };
417
+
418
+ addListener(function () {
419
+ if (_keys(results).length === keys.length) {
420
+ callback(null, results);
421
+ callback = function () {};
422
+ }
423
+ });
424
+
425
+ _each(keys, function (k) {
426
+ var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
427
+ var taskCallback = function (err) {
428
+ if (err) {
429
+ callback(err);
430
+ // stop subsequent errors hitting callback multiple times
431
+ callback = function () {};
432
+ }
433
+ else {
434
+ var args = Array.prototype.slice.call(arguments, 1);
435
+ if (args.length <= 1) {
436
+ args = args[0];
437
+ }
438
+ results[k] = args;
439
+ async.nextTick(taskComplete);
440
+ }
441
+ };
442
+ var requires = task.slice(0, Math.abs(task.length - 1)) || [];
443
+ var ready = function () {
444
+ return _reduce(requires, function (a, x) {
445
+ return (a && results.hasOwnProperty(x));
446
+ }, true) && !results.hasOwnProperty(k);
447
+ };
448
+ if (ready()) {
449
+ task[task.length - 1](taskCallback, results);
450
+ }
451
+ else {
452
+ var listener = function () {
453
+ if (ready()) {
454
+ removeListener(listener);
455
+ task[task.length - 1](taskCallback, results);
456
+ }
457
+ };
458
+ addListener(listener);
459
+ }
460
+ });
461
+ };
462
+
463
+ async.waterfall = function (tasks, callback) {
464
+ callback = callback || function () {};
465
+ if (!tasks.length) {
466
+ return callback();
467
+ }
468
+ var wrapIterator = function (iterator) {
469
+ return function (err) {
470
+ if (err) {
471
+ callback.apply(null, arguments);
472
+ callback = function () {};
473
+ }
474
+ else {
475
+ var args = Array.prototype.slice.call(arguments, 1);
476
+ var next = iterator.next();
477
+ if (next) {
478
+ args.push(wrapIterator(next));
479
+ }
480
+ else {
481
+ args.push(callback);
482
+ }
483
+ async.nextTick(function () {
484
+ iterator.apply(null, args);
485
+ });
486
+ }
487
+ };
488
+ };
489
+ wrapIterator(async.iterator(tasks))();
490
+ };
491
+
492
+ var _parallel = function(eachfn, tasks, callback) {
493
+ callback = callback || function () {};
494
+ if (tasks.constructor === Array) {
495
+ eachfn.map(tasks, function (fn, callback) {
496
+ if (fn) {
497
+ fn(function (err) {
498
+ var args = Array.prototype.slice.call(arguments, 1);
499
+ if (args.length <= 1) {
500
+ args = args[0];
501
+ }
502
+ callback.call(null, err, args);
503
+ });
504
+ }
505
+ }, callback);
506
+ }
507
+ else {
508
+ var results = {};
509
+ eachfn.each(_keys(tasks), function (k, callback) {
510
+ tasks[k](function (err) {
511
+ var args = Array.prototype.slice.call(arguments, 1);
512
+ if (args.length <= 1) {
513
+ args = args[0];
514
+ }
515
+ results[k] = args;
516
+ callback(err);
517
+ });
518
+ }, function (err) {
519
+ callback(err, results);
520
+ });
521
+ }
522
+ };
523
+
524
+ async.parallel = function (tasks, callback) {
525
+ _parallel({ map: async.map, each: async.each }, tasks, callback);
526
+ };
527
+
528
+ async.parallelLimit = function(tasks, limit, callback) {
529
+ _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
530
+ };
531
+
532
+ async.series = function (tasks, callback) {
533
+ callback = callback || function () {};
534
+ if (tasks.constructor === Array) {
535
+ async.mapSeries(tasks, function (fn, callback) {
536
+ if (fn) {
537
+ fn(function (err) {
538
+ var args = Array.prototype.slice.call(arguments, 1);
539
+ if (args.length <= 1) {
540
+ args = args[0];
541
+ }
542
+ callback.call(null, err, args);
543
+ });
544
+ }
545
+ }, callback);
546
+ }
547
+ else {
548
+ var results = {};
549
+ async.eachSeries(_keys(tasks), function (k, callback) {
550
+ tasks[k](function (err) {
551
+ var args = Array.prototype.slice.call(arguments, 1);
552
+ if (args.length <= 1) {
553
+ args = args[0];
554
+ }
555
+ results[k] = args;
556
+ callback(err);
557
+ });
558
+ }, function (err) {
559
+ callback(err, results);
560
+ });
561
+ }
562
+ };
563
+
564
+ async.iterator = function (tasks) {
565
+ var makeCallback = function (index) {
566
+ var fn = function () {
567
+ if (tasks.length) {
568
+ tasks[index].apply(null, arguments);
569
+ }
570
+ return fn.next();
571
+ };
572
+ fn.next = function () {
573
+ return (index < tasks.length - 1) ? makeCallback(index + 1): null;
574
+ };
575
+ return fn;
576
+ };
577
+ return makeCallback(0);
578
+ };
579
+
580
+ async.apply = function (fn) {
581
+ var args = Array.prototype.slice.call(arguments, 1);
582
+ return function () {
583
+ return fn.apply(
584
+ null, args.concat(Array.prototype.slice.call(arguments))
585
+ );
586
+ };
587
+ };
588
+
589
+ var _concat = function (eachfn, arr, fn, callback) {
590
+ var r = [];
591
+ eachfn(arr, function (x, cb) {
592
+ fn(x, function (err, y) {
593
+ r = r.concat(y || []);
594
+ cb(err);
595
+ });
596
+ }, function (err) {
597
+ callback(err, r);
598
+ });
599
+ };
600
+ async.concat = doParallel(_concat);
601
+ async.concatSeries = doSeries(_concat);
602
+
603
+ async.whilst = function (test, iterator, callback) {
604
+ if (test()) {
605
+ var sync = true;
606
+ iterator(function (err) {
607
+ if (err) {
608
+ return callback(err);
609
+ }
610
+ if (sync) {
611
+ async.nextTick(function () {
612
+ async.whilst(test, iterator, callback);
613
+ });
614
+ }
615
+ else {
616
+ async.whilst(test, iterator, callback);
617
+ }
618
+ });
619
+ sync = false;
620
+ }
621
+ else {
622
+ callback();
623
+ }
624
+ };
625
+
626
+ async.doWhilst = function (iterator, test, callback) {
627
+ var sync = true;
628
+ iterator(function (err) {
629
+ if (err) {
630
+ return callback(err);
631
+ }
632
+ if (test()) {
633
+ if (sync) {
634
+ async.nextTick(function () {
635
+ async.doWhilst(iterator, test, callback);
636
+ });
637
+ }
638
+ else {
639
+ async.doWhilst(iterator, test, callback);
640
+ }
641
+ }
642
+ else {
643
+ callback();
644
+ }
645
+ });
646
+ sync = false;
647
+ };
648
+
649
+ async.until = function (test, iterator, callback) {
650
+ if (!test()) {
651
+ var sync = true;
652
+ iterator(function (err) {
653
+ if (err) {
654
+ return callback(err);
655
+ }
656
+ if (sync) {
657
+ async.nextTick(function () {
658
+ async.until(test, iterator, callback);
659
+ });
660
+ }
661
+ else {
662
+ async.until(test, iterator, callback);
663
+ }
664
+ });
665
+ sync = false;
666
+ }
667
+ else {
668
+ callback();
669
+ }
670
+ };
671
+
672
+ async.doUntil = function (iterator, test, callback) {
673
+ var sync = true;
674
+ iterator(function (err) {
675
+ if (err) {
676
+ return callback(err);
677
+ }
678
+ if (!test()) {
679
+ if (sync) {
680
+ async.nextTick(function () {
681
+ async.doUntil(iterator, test, callback);
682
+ });
683
+ }
684
+ else {
685
+ async.doUntil(iterator, test, callback);
686
+ }
687
+ }
688
+ else {
689
+ callback();
690
+ }
691
+ });
692
+ sync = false;
693
+ };
694
+
695
+ async.queue = function (worker, concurrency) {
696
+ function _insert(q, data, pos, callback) {
697
+ if(data.constructor !== Array) {
698
+ data = [data];
699
+ }
700
+ _each(data, function(task) {
701
+ var item = {
702
+ data: task,
703
+ callback: typeof callback === 'function' ? callback : null
704
+ };
705
+
706
+ if (pos) {
707
+ q.tasks.unshift(item);
708
+ } else {
709
+ q.tasks.push(item);
710
+ }
711
+
712
+ if (q.saturated && q.tasks.length === concurrency) {
713
+ q.saturated();
714
+ }
715
+ async.nextTick(q.process);
716
+ });
717
+ }
718
+
719
+ var workers = 0;
720
+ var q = {
721
+ tasks: [],
722
+ concurrency: concurrency,
723
+ saturated: null,
724
+ empty: null,
725
+ drain: null,
726
+ push: function (data, callback) {
727
+ _insert(q, data, false, callback);
728
+ },
729
+ unshift: function (data, callback) {
730
+ _insert(q, data, true, callback);
731
+ },
732
+ process: function () {
733
+ if (workers < q.concurrency && q.tasks.length) {
734
+ var task = q.tasks.shift();
735
+ if (q.empty && q.tasks.length === 0) {
736
+ q.empty();
737
+ }
738
+ workers += 1;
739
+ var sync = true;
740
+ var next = function () {
741
+ workers -= 1;
742
+ if (task.callback) {
743
+ task.callback.apply(task, arguments);
744
+ }
745
+ if (q.drain && q.tasks.length + workers === 0) {
746
+ q.drain();
747
+ }
748
+ q.process();
749
+ };
750
+ var cb = only_once(function () {
751
+ var cbArgs = arguments;
752
+
753
+ if (sync) {
754
+ async.nextTick(function () {
755
+ next.apply(null, cbArgs);
756
+ });
757
+ } else {
758
+ next.apply(null, arguments);
759
+ }
760
+ });
761
+ worker(task.data, cb);
762
+ sync = false;
763
+ }
764
+ },
765
+ length: function () {
766
+ return q.tasks.length;
767
+ },
768
+ running: function () {
769
+ return workers;
770
+ }
771
+ };
772
+ return q;
773
+ };
774
+
775
+ async.cargo = function (worker, payload) {
776
+ var working = false,
777
+ tasks = [];
778
+
779
+ var cargo = {
780
+ tasks: tasks,
781
+ payload: payload,
782
+ saturated: null,
783
+ empty: null,
784
+ drain: null,
785
+ push: function (data, callback) {
786
+ if(data.constructor !== Array) {
787
+ data = [data];
788
+ }
789
+ _each(data, function(task) {
790
+ tasks.push({
791
+ data: task,
792
+ callback: typeof callback === 'function' ? callback : null
793
+ });
794
+ if (cargo.saturated && tasks.length === payload) {
795
+ cargo.saturated();
796
+ }
797
+ });
798
+ async.nextTick(cargo.process);
799
+ },
800
+ process: function process() {
801
+ if (working) return;
802
+ if (tasks.length === 0) {
803
+ if(cargo.drain) cargo.drain();
804
+ return;
805
+ }
806
+
807
+ var ts = typeof payload === 'number'
808
+ ? tasks.splice(0, payload)
809
+ : tasks.splice(0);
810
+
811
+ var ds = _map(ts, function (task) {
812
+ return task.data;
813
+ });
814
+
815
+ if(cargo.empty) cargo.empty();
816
+ working = true;
817
+ worker(ds, function () {
818
+ working = false;
819
+
820
+ var args = arguments;
821
+ _each(ts, function (data) {
822
+ if (data.callback) {
823
+ data.callback.apply(null, args);
824
+ }
825
+ });
826
+
827
+ process();
828
+ });
829
+ },
830
+ length: function () {
831
+ return tasks.length;
832
+ },
833
+ running: function () {
834
+ return working;
835
+ }
836
+ };
837
+ return cargo;
838
+ };
839
+
840
+ var _console_fn = function (name) {
841
+ return function (fn) {
842
+ var args = Array.prototype.slice.call(arguments, 1);
843
+ fn.apply(null, args.concat([function (err) {
844
+ var args = Array.prototype.slice.call(arguments, 1);
845
+ if (typeof console !== 'undefined') {
846
+ if (err) {
847
+ if (console.error) {
848
+ console.error(err);
849
+ }
850
+ }
851
+ else if (console[name]) {
852
+ _each(args, function (x) {
853
+ console[name](x);
854
+ });
855
+ }
856
+ }
857
+ }]));
858
+ };
859
+ };
860
+ async.log = _console_fn('log');
861
+ async.dir = _console_fn('dir');
862
+ /*async.info = _console_fn('info');
863
+ async.warn = _console_fn('warn');
864
+ async.error = _console_fn('error');*/
865
+
866
+ async.memoize = function (fn, hasher) {
867
+ var memo = {};
868
+ var queues = {};
869
+ hasher = hasher || function (x) {
870
+ return x;
871
+ };
872
+ var memoized = function () {
873
+ var args = Array.prototype.slice.call(arguments);
874
+ var callback = args.pop();
875
+ var key = hasher.apply(null, args);
876
+ if (key in memo) {
877
+ callback.apply(null, memo[key]);
878
+ }
879
+ else if (key in queues) {
880
+ queues[key].push(callback);
881
+ }
882
+ else {
883
+ queues[key] = [callback];
884
+ fn.apply(null, args.concat([function () {
885
+ memo[key] = arguments;
886
+ var q = queues[key];
887
+ delete queues[key];
888
+ for (var i = 0, l = q.length; i < l; i++) {
889
+ q[i].apply(null, arguments);
890
+ }
891
+ }]));
892
+ }
893
+ };
894
+ memoized.memo = memo;
895
+ memoized.unmemoized = fn;
896
+ return memoized;
897
+ };
898
+
899
+ async.unmemoize = function (fn) {
900
+ return function () {
901
+ return (fn.unmemoized || fn).apply(null, arguments);
902
+ };
903
+ };
904
+
905
+ async.times = function (count, iterator, callback) {
906
+ var counter = [];
907
+ for (var i = 0; i < count; i++) {
908
+ counter.push(i);
909
+ }
910
+ return async.map(counter, iterator, callback);
911
+ };
912
+
913
+ async.timesSeries = function (count, iterator, callback) {
914
+ var counter = [];
915
+ for (var i = 0; i < count; i++) {
916
+ counter.push(i);
917
+ }
918
+ return async.mapSeries(counter, iterator, callback);
919
+ };
920
+
921
+ async.compose = function (/* functions... */) {
922
+ var fns = Array.prototype.reverse.call(arguments);
923
+ return function () {
924
+ var that = this;
925
+ var args = Array.prototype.slice.call(arguments);
926
+ var callback = args.pop();
927
+ async.reduce(fns, args, function (newargs, fn, cb) {
928
+ fn.apply(that, newargs.concat([function () {
929
+ var err = arguments[0];
930
+ var nextargs = Array.prototype.slice.call(arguments, 1);
931
+ cb(err, nextargs);
932
+ }]))
933
+ },
934
+ function (err, results) {
935
+ callback.apply(that, [err].concat(results));
936
+ });
937
+ };
938
+ };
939
+
940
+ // AMD / RequireJS
941
+ if (typeof define !== 'undefined' && define.amd) {
942
+ define([], function () {
943
+ return async;
944
+ });
945
+ }
946
+ // Node.js
947
+ else if (typeof module !== 'undefined' && module.exports) {
948
+ module.exports = async;
949
+ }
950
+ // included directly via <script> tag
951
+ else {
952
+ root.async = async;
953
+ }
954
+
955
+ }());
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: async-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jason Chen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: railties
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ description: Rails asset pipeline wrapper for async.js
31
+ email:
32
+ - jhchen7@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - lib/async-rails/version.rb
38
+ - lib/async-rails.rb
39
+ - vendor/assets/javascripts/async.js
40
+ - MIT-LICENSE
41
+ - README.md
42
+ homepage: https://github.com/jhchen/async-rails
43
+ licenses: []
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 1.8.24
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Rails asset pipeline wrapper for async.js
66
+ test_files: []