From bc64ae92329886df51a6a0d1912f6da989244858 Mon Sep 17 00:00:00 2001 From: Avril Date: Sat, 12 Feb 2022 18:51:02 +0000 Subject: [PATCH] semaphore attampt 1: failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fortune for async-timeout-js's current commit: Curse − 凶 --- semaphore.js | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 semaphore.js diff --git a/semaphore.js b/semaphore.js new file mode 100644 index 0000000..3ae213e --- /dev/null +++ b/semaphore.js @@ -0,0 +1,53 @@ + +function SemaphoreDisposed(message) { this.message = message || "Semaphore was disposed"; Object.freeze(this); } + +const new_id = () => { + +}; +apsdajod XXX: eh, this isn't working... + +function Semaphore(cap) +{ + + function Handle(next, id) + { + this.state = next; + this.id = id || new_id(); + } + + Handle.create = function(resolve, reject, id) { + let handle = new Handle(this, id); + handle.state[handle.id] = (error) => error ? reject(error) : resolve(); + return handle; + }; + + // Waiters for the seamphore + var next = { + waiters: {}, + // Push a waiter into the queue and return a promise for when it completes + wait: () => { + new Promise((resolve, reject) => { // next.waiters.push(error => error ? reject(error) : resolve())) + return Handle.create(resolve, reject).bind(next); + }); + }, + // Pop a waiter from the queue and complete its promise (with an optional truthy error) + add: (error) => { if(next.waiters.length>0) next.waiters.shift()(error); }, + // Complete all semaphores, with an optional truthy error for rejection + flush: (reject) => { + while(next.waiters.length>0) next.waiters.shift()(reject); + }, + // Dispose all semaphores in the waiter + dispose: (message) => next.flush(new SemaphoreDisposed(message)) + }; + + this.capacity = cap; + this.length = 0; + + this.acquire = async () => { + + }; + + this.release = () => { + + }; +}