{"_id":"@berlysia/p-fied","_rev":"4-610e29d0c8b033db4d825f732ed75d89","name":"@berlysia/p-fied","description":"PromisiFIED asynchronous utility module.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"@berlysia/p-fied","version":"0.0.1","description":"PromisiFIED asynchronous utility module.","main":"lib/index.js","scripts":{"build":"babel src --out-dir lib","watch":"babel src --out-dir lib -w","format":"esformatter -i src/**/*.js test/**/*.js","clean":"rm -rf lib/*","test":"mocha --compilers js:espower-babel/guess test/**/*.test.js"},"author":{"name":"berlysia"},"license":"MIT","devDependencies":{"babel":"^5.8.20","debug":"^2.2.0","esformatter":"^0.7.2","espower-babel":"^3.2.0","mocha":"^2.2.5","power-assert":"^0.11.0","sinon":"^1.15.4"},"keywords":["promise","promisified","control","loop","for","while","until","queue","priority queue","asyncronous","async"],"dependencies":{"@berlysia/remote-switch":"^0.1.1","priorityqueue":"^0.1.0"},"gitHead":"70f4a0599fdf69910b81516294e1a0d3c3b497f9","_id":"@berlysia/p-fied@0.0.1","_shasum":"1ac6c41aac069c49f5400b914a8fbd8c94076a61","_from":".","_npmVersion":"2.13.0","_nodeVersion":"2.4.0","_npmUser":{"name":"berlysia","email":"berlysia@gmail.com"},"dist":{"shasum":"1ac6c41aac069c49f5400b914a8fbd8c94076a61","tarball":"https://registry.npmjs.org/@berlysia/p-fied/-/p-fied-0.0.1.tgz","integrity":"sha512-ixWmA1yZP4Iz/FvxbTAYXGSLsRx9vz6FE7lW91JQYWaRXhEMr5Mh0tRrU/KwJNpSwqYfbMeNK0PUzZa17aigEg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEOb1y9ycF9ul9e4SK17eiTV5s6dPmDqnDjiUJGMZkFgAiEAtasMCBxpiy30J9uxxoriZ+tcuFkWfxUwsToV57WXwO0="}]},"maintainers":[{"name":"berlysia","email":"berlysia@gmail.com"}]},"0.0.2":{"name":"@berlysia/p-fied","version":"0.0.2","description":"PromisiFIED asynchronous utility module.","main":"lib/index.js","scripts":{"build":"babel src --out-dir lib","watch":"babel src --out-dir lib -w","format":"esformatter -i src/**/*.js test/**/*.js","clean":"rm -rf lib/*","test":"mocha --compilers js:espower-babel/guess test/**/*.test.js"},"author":{"name":"berlysia"},"license":"MIT","devDependencies":{"babel":"^5.8.20","debug":"^2.2.0","esformatter":"^0.7.2","espower-babel":"^3.2.0","mocha":"^2.2.5","power-assert":"^0.11.0","sinon":"^1.15.4"},"keywords":["promise","promisified","control","loop","for","while","until","queue","priority queue","asyncronous","async"],"dependencies":{"@berlysia/remote-switch":"^0.1.1","priorityqueue":"^0.1.0"},"gitHead":"2cd7072257d08633db1d03ec7172db96ff46ac8b","_id":"@berlysia/p-fied@0.0.2","_shasum":"c150782bb2e35c538fe4a4d01e09acc46a764a6e","_from":".","_npmVersion":"2.13.0","_nodeVersion":"2.4.0","_npmUser":{"name":"berlysia","email":"berlysia@gmail.com"},"dist":{"shasum":"c150782bb2e35c538fe4a4d01e09acc46a764a6e","tarball":"https://registry.npmjs.org/@berlysia/p-fied/-/p-fied-0.0.2.tgz","integrity":"sha512-oMw/1mJIoIszMli9XxxrWs6gO+mB7cSicQYNev5PTagQnPEYqjS/y0WFVFrl7rFW3S1wx80nqe7D34jDxCNJIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0cBvVe03Wh5/DdRvPypiBYQBERlvPGCjtrj2yNgXGmAIgLfG7vr4IEHs8B69KXBC+cjf4Gydhat4UDKl6ZF1YZlQ="}]},"maintainers":[{"name":"berlysia","email":"berlysia@gmail.com"}]}},"readme":"p-fied\n====\nPromisiFIED asynchronous utility module.\n\n\nMotivation\n---- \nasync.js proposed a lot of asynchronous way in JavaScript. But now we have a `Promise`.\n\nSome of async.js functions can be easily expressed with the `Promise` (e.g. `series`, `parallel`...), so p-fied doesn't have these functions.\n\nここまで書いて async.js と Bluebird で足りたんじゃないのという気持ちになった．元気がなくなったので日本語で書く．\n\n\n### pfor(initialState, test, update, routine)\n```\nfor([initialState], [test], [update]){\n\t[routine]\n}\n```\n\n#### arguments\n- `initialState` - 初期状態を示す`Object`．\n- `test` - `(state: Object) => bool | Promise<bool>`．`true`ならループ続行，`false`でループ終了． \n- `update` - `(state: Object) => state`．状態を更新する．返値を更新後の値とする．返さなかった場合は`routine`の返値\n- `routine` - `(state: Object) => state | Promise<state> | true | Promise<true> | any`．ループのメイン処理を表現する．返値が状態オブジェクトやそのPromiseであるならば，`update`に渡す値はここで返した値となる．ループ中のいわゆる`continue`を，`routine`がsynchronousである場合は`return`で，asynchronousである場合は`return resolvedPromise`で表現する．`break`は`return rejectedPromise(true)`で表現する．\n\n- returns `Promise<state>`. エラー終了した場合は`rejected`，その他の場合は`resolved`．\n\n```javascript\npfied.pfor({i: 0}, s => s.i < 5, s => {i: s.i+1}, s => {\n\tsetImmediate(_ => console.log(s.i));\n}).then(s => console.log(\"done! %d\", s.i));\n/*\n0\n1\n2\n3\n4\ndone! 5\n*/\n```\n\n動作の詳細例はテストコードが参考になるだろう．\n\n### whilst(test, routine, initialState?)\n### doWhilst(test, routine, initialState?)\n`while`文に対応．`test`が`true || Promise<true>`な間，`routine`を実行する．`initialState`は省略可能．`routine`の挙動は`pfor`のものに従う．\n\n`doWhilst`はそのまま`do-while`文に対応する．\n\n### until(test, routine, initialState?)\n### doUntil(test, routine, initialState?)\n`while`文に対応するが，`test`が`false || Promise<false>`である間に`routine`を実行する．他は`whilst`や`doWhilst`に従う．\n\n### forever(routine, initialState)\n無限ループ．`routine`は`pfor`のものと同様の動作を期待する．\n\n\n### new Queue(worker, concurrency = 1)\nasync.jsのQueueと同様の機能を提供する．\n\n- `worker` - `(task: Object) => any`．キューからタスクを受け取って処理する．\n- `concurrency` - 並行して最大いくつまで`worker`を実行するか指定する．初期値は1．\n\n- `Queue#push(task: Object) => Promise<worker returning value>`\n- `Queue#unshift(task: Object) => Promise<worker returning value>`\nキューにタスクを追加する．`push`はFIFO，`unshift`はLIFO．返値はそのタスクが処理されたときに解決される`Promise`．\n\n- `Queue#pushBulk(tasks: [Object]) => [Promise<worker returning value>]`\n- `Queue#unshiftBulk(tasks: [Object]) => [Promise<worker returning value>]`\nキューにタスクを一度に複数個追加する．返値は単体時と同様の`Promise`からなる`Array`．与えたタスク列の順に対応している．\n\n- `running()` - ワーカーが処理中か否か `true`/`false`\n- `idle()` - `!running()`\n- `pause()` - ワーカーの追加を中止する．現在処理中のものは続行する．\n- `resume()` - ワーカーの追加を再開する．\n- `kill()` - ワーカーに渡されていないタスクをドロップする．\n- `saturated` - タスクを追加する操作をしたとき，保持するタスク数が`currency`を超えた場合にコールバックする関数を指定する．\n- `empty` - タスク保持数がゼロになったときにコールバックする関数を指定する．\n- `drain` - ワーカー稼働数がゼロになったときにコールバックする関数を指定する．\n- `error` - ワーカー稼働中にエラーが発生した場合にコールバックする関数を指定する．エラーを第一引数で受け取れる．\n\n### new Cargo(worker, payload = 1)\n`Queue`に近いが，ワーカーに渡すとき`payload`の数を最大値として取れるだけ取り，配列に詰めて渡す．結果の`Promise`はワーカーが正常終了すれば個別に返る．ワーカーが失敗すると一緒に渡されたタスクの結果`Promise`は失敗原因で`reject`される．\n\n### new ProirityQueue(worker, concurrency, comperator)\n`Queue`に近いが，タスク間の順序を定義しておくことで，その順にワーカーに渡す．先頭や末尾に追加するという概念がないので，`unshift`を持たない．順序定義用の関数`comperator`は，`Array.prototype.sort`が引数として要求する形式を満たすこと．\n\nasync.jsのものは固定値で優先度を定義してその順に取り出していたため，優先度の与え方がまったく異なる．\n\n\n","maintainers":[{"name":"berlysia","email":"berlysia@gmail.com"}],"time":{"modified":"2022-06-12T15:11:19.311Z","created":"2015-08-04T19:36:10.599Z","0.0.1":"2015-08-04T19:36:10.599Z","0.0.2":"2015-08-28T08:00:12.834Z"},"keywords":["promise","promisified","control","loop","for","while","until","queue","priority queue","asyncronous","async"],"author":{"name":"berlysia"},"license":"MIT","readmeFilename":"README.md"}