test('should not drop puts', (t) => { t.plan(3) let dispatch = createDispatch() let {take, put} = channel() function * fnA () { while (true) { let res = yield take() yield fork(someAction(res)) } } function * fnB () { yield put(1) yield put(2) yield put(3) } let count = 1 function * someAction (res) { t.equal(res, count++) } dispatch(function * () { yield [fork(fnA), fork(fnB)] }) })
function push (val) { let {take: getRet, put: ret} = channel() return dispatch([val, ret]) .then(function () { return getRet() }) .then(function (task) { return task.done }) }
function driver (fn) { let {take: getDispatch, put: dispatch} = channel() fn && fn(push) return { push, drive: function * (listener) { listener = listener || identity return yield fork(drive(getDispatch, listener)) } } function push (val) { let {take: getRet, put: ret} = channel() return dispatch([val, ret]) .then(function () { return getRet() }) .then(function (task) { return task.done }) } }