From a2770298f040307f8dd59c7a88d7e40d37faec14 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 6 Aug 2021 19:19:23 +0200 Subject: Add source code --- limiting.lua | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 limiting.lua (limited to 'limiting.lua') diff --git a/limiting.lua b/limiting.lua new file mode 100644 index 0000000..d5df448 --- /dev/null +++ b/limiting.lua @@ -0,0 +1,37 @@ +lua_async.limiting = { + pool = {}, +} + +function lua_async.limiting.unset_limit(co) + lua_async.limiting.pool[co] = nil +end + +function lua_async.set_limit(ms) + local co = assert(coroutine.running(), "set_limit called outside of an async function") + + local limit = ms / 1000 + + lua_async.limiting.pool[co] = { + limit = limit, + next_yield = os.clock() + limit, + } +end + +function lua_async.unset_limit() + local co = assert(coroutine.running(), "unset_limit called outside of an async function") + lua_async.limiting.unset_limit(co) +end + +function lua_async.check_limit() + local co = assert(coroutine.running(), "check_limit called outside of an async function") + local limit = lua_async.limiting.pool[co] + + if limit and os.clock() >= limit.next_yield then + lua_async.yield() + limit.next_yield = os.clock() + limit.limit + return true + end + + return false +end + -- cgit v1.2.3