diff options
author | Matthew Wild <mwild1@gmail.com> | 2018-03-22 07:56:01 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2018-03-22 07:56:01 +0000 |
commit | 38ac92b0df128fea95cb790f2920d747045598df (patch) | |
tree | 4f94912e6ab5403a1322045f6b9e55d5b59404dc | |
parent | b48a2409e74c7396ab1fcaf81f7ca17881612857 (diff) | |
download | prosody-38ac92b0df128fea95cb790f2920d747045598df.tar.gz prosody-38ac92b0df128fea95cb790f2920d747045598df.zip |
util.async: Add once() to create temporary runners
-rw-r--r-- | spec/util_async_spec.lua | 10 | ||||
-rw-r--r-- | util/async.lua | 22 |
2 files changed, 31 insertions, 1 deletions
diff --git a/spec/util_async_spec.lua b/spec/util_async_spec.lua index ac71e755..f7e469c9 100644 --- a/spec/util_async_spec.lua +++ b/spec/util_async_spec.lua @@ -593,4 +593,14 @@ describe("util.async", function() assert.spy(r.watchers.error).was_not.called(); end); end); + + describe("#once()", function () + it("should work", function () + local f = spy.new(function () + assert.truthy(async.ready()); + end); + async.once(f); + assert.spy(f).was.called(); + end); + end); end); diff --git a/util/async.lua b/util/async.lua index 1930d1a9..8e75a524 100644 --- a/util/async.lua +++ b/util/async.lua @@ -219,4 +219,24 @@ local function ready() return pcall(checkthread); end -return { ready = ready, waiter = waiter, guarder = guarder, runner = runner }; +local once; -- forward declaration +do + local once_watchers = { + error = function (_, err) + error(err); + end; + }; + local function once_runner(func) func(); end + function once(func) + local r = runner(func, once_watchers); + return r:run(func); + end +end + +return { + once = once; + ready = ready; + waiter = waiter; + guarder = guarder; + runner = runner +}; |