LazyChain

Asynchronous method chain implemented in JavaScript

FRP(Functional reactive programming) supporting jQuery plugin


Lazy Now

Lazy
  [1, 2, 3]      ->  .lazy()  ->  [2], [1], [3]
  [3], [2], [1]  ->  .lazy()  ->  [1], [3], [2]

                    sequential
  [1, 2, 3]      ->  .lazy()  ->  [2, 1, 3]
  [3], [2], [1]  ->  .lazy()  ->  [1], [3], [2]

Stream
  [1, 2, 3]      -> .stream() ->  [1, 2, 3]
  [3], [2], [1]  -> .stream() ->  [3], [2], [1]

Branch
  [1, 2, 3]      -> .stream() ->  [1, 2, 3]
                              ->  [1, 2, 3]

  [3], [2], [1]  -> .stream() ->  [3], [2], [1]
                              ->  [3], [2], [1]

Split
  [1, Err, 2]    -> .stream() ->  [1, 2]
                              ->  [Err]
  [2], [Err], [1]-> .stream() ->  [2], [1]
                              ->  [Err]

Merge
  [1, 2, 3]
  [4, 5, 6]      -> .stream() ->  [4, 5, 6], [1, 2, 3]
  [3], [2], [1]
  [6], [5], [4]  -> .stream() ->  [6], [5], [4], [3], [2], [1]

Compose
  stream1
  stream2
  stream3        -> .stream() ->  stream3 * stream2 * stream1
                                ( stream1 . stream2 . stream3 )

Buffer
  [2, 3], [1]    ->  .lazy()  ->  [3], [1, 2]
// Asynchronous method chain
LazyChain([1, 2])
  .lazy(function (v, i, a, e, d) { setTimeout(function () { d.resolve(v * 2) }, 50) }, true)
  .map(function (v) { return v * 3 })
  .lazy(function (v, i, a, e, d) { setTimeout(function () { d.resolve(v * 10) }, 50) }, true)
  .reduce(function (r, v, i, a) { return r + v }, 0)
  .forEach(function (v) {
    console.log(v); // 180 = (1 * 2 * 3 * 10) + (2 * 2 * 3 * 10)
  });

LazyChain($.ajax(''))
  .filter(function (v) { return 'object' === typeof v })
  .forEach(function (xhr) {
    console.log(xhr); // XHR object
  });
LazyChain(true);
['./']
  .lazy(function (v) { return $.ajax(v) })
  .filter(function (v) { return 'object' === typeof v })
  .forEach(function (xhr) {
    console.log(xhr); // XHR object
  });
LazyChain(false);

// Stream generate and control
var a = LazyChain(),
    b = LazyChain();

LazyChain(a)
  .stream('number', b)
  .stream(function (v, i, a, e) {
    console.log(v); // 0
  });

a.notify(0, '');
b
  .stream(function (v, i, a, e) {
    console.log(typeof v); // string
  });

Installation

<script charset="utf-8" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script charset="utf-8" src="/js/lazychain.js"></script>

Extend

Underscore.js / Lo-Dash

LazyChain([1, 2, 3], _ )
  .stream(function (v) {
    console.log(v); // 1, 2, 3
  })
  .difference([1, 3])
  .stream(function (v) {
    console.log(v); // 2
  });

Documentation

API

LazyChain

Extend the array and jQueryDeferred object.

.lazy()

Messaging api.

.stream()

Stream control api.

Spec

Sorry, japanese documents only. I welcome translation.

Browser

  • IE9+
  • Chrome
  • Firefox
  • Safari
  • Android
  • iOS

jQuery

1.7.2+

Test

Coverage

ChangeLog

changelog

License

MIT License