From 6cd813848e49d21c2b8daf0d6e21005eb40b8670 Mon Sep 17 00:00:00 2001 From: Jason G <41053218+gianghungtien@users.noreply.github.com> Date: Fri, 24 Jul 2026 05:58:39 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20Merge=20PR=20#75290=20[semaphore?= =?UTF-8?q?]=20Pass=20leave=20callback=20to=20Task=20by=20@gianghungtien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- types/semaphore/index.d.ts | 11 ++++++++++- types/semaphore/semaphore-tests.ts | 13 +++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/types/semaphore/index.d.ts b/types/semaphore/index.d.ts index 0fe1e2e56452017..7fa0d829bf12054 100644 --- a/types/semaphore/index.d.ts +++ b/types/semaphore/index.d.ts @@ -1,8 +1,17 @@ declare function semaphore(capacity?: number): semaphore.Semaphore; declare namespace semaphore { + /** + * Releases `n` (default `1`) units of capacity back to the semaphore. + */ + type Leave = (n?: number) => void; + interface Task { - (): void; + /** + * @param leave Releases the capacity held by this task. `take` passes it to every + * task it runs, so a task can release the semaphore without closing over it. + */ + (leave: Leave): void; } interface Semaphore { diff --git a/types/semaphore/semaphore-tests.ts b/types/semaphore/semaphore-tests.ts index 479853e5d1bab63..ab3b24fc2cdd2ab 100644 --- a/types/semaphore/semaphore-tests.ts +++ b/types/semaphore/semaphore-tests.ts @@ -13,3 +13,16 @@ sem.leave(2); sem.current; const available: boolean = sem.available(2); + +// `take` passes `leave` to every task, so a task can release the semaphore +// without closing over it. Tasks that ignore it still type-check. +sem.take((leave: semaphore.Leave) => { + console.log("My task"); + leave(); +}); + +sem.take(2, (leave) => { + // $ExpectType Leave + leave; + leave(2); +});