From b6c638abbd2e60b6e0c68405567ed27346417850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sun, 6 Oct 2019 13:17:39 +0200 Subject: [PATCH] Add onFirstPause utility method --- README.md | 5 +++++ index.js | 18 +++++++++++++++++- index.js.flow | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f68ce1a..1f75c2c 100644 --- a/README.md +++ b/README.md @@ -194,3 +194,8 @@ const loadFiles = gensync(function* () { ]); }); ``` + +### gensync.onFirstPause(generator, callback) + +This method returns a gensync generator which calls `callback` when `generator` +yields an async operation. diff --git a/index.js b/index.js index 399bc11..5fbcf3d 100644 --- a/index.js +++ b/index.js @@ -71,6 +71,16 @@ module.exports = Object.assign( } }, }), + onFirstPause: buildOperation({ + name: "onFirstPause", + arity: 2, + sync: function([item]) { + return evaluateSync(item); + }, + async: function([item, cb], resolve, reject) { + evaluateAsync(item, resolve, reject, cb); + }, + }), } ); @@ -247,7 +257,8 @@ function evaluateSync(gen) { return value; } -function evaluateAsync(gen, resolve, reject) { +function evaluateAsync(gen, resolve, reject, onFirstPause) { + let didFirstPause = false; (function step() { try { let value; @@ -271,6 +282,11 @@ function evaluateAsync(gen, resolve, reject) { assertSuspend(out, gen); if (!didSyncResume) { + if (!didFirstPause && onFirstPause) { + didFirstPause = true; + onFirstPause(); + } + // Callback wasn't called synchronously, so break out of the loop // and let it call 'step' later. return; diff --git a/index.js.flow b/index.js.flow index fa22e0b..9c124f8 100644 --- a/index.js.flow +++ b/index.js.flow @@ -29,4 +29,5 @@ declare module.exports: { all(Array>): Handler, race(Array>): Handler, + onFirstPause(Handler, cb: Function): Handler, };