11/**
2- * CoalescingDrainableWorker - A keyed worker that keeps only the latest value per key.
2+ * KeyedCoalescingWorker - A keyed worker that keeps only the latest value per key.
33 *
44 * Enqueues for an active or already-queued key are merged atomically instead of
55 * creating duplicate queued items. `drainKey()` resolves only when that key has
66 * no queued, pending, or active work left.
77 *
8- * @module CoalescingDrainableWorker
8+ * @module KeyedCoalescingWorker
99 */
1010import type { Scope } from "effect" ;
1111import { Effect , TxQueue , TxRef } from "effect" ;
1212
13- export interface CoalescingDrainableWorker < K , V > {
13+ export interface KeyedCoalescingWorker < K , V > {
1414 readonly enqueue : ( key : K , value : V ) => Effect . Effect < void > ;
1515 readonly drainKey : ( key : K ) => Effect . Effect < void > ;
16- readonly drain : Effect . Effect < void > ;
1716}
1817
19- interface CoalescingWorkerState < K , V > {
18+ interface KeyedCoalescingWorkerState < K , V > {
2019 readonly latestByKey : Map < K , V > ;
2120 readonly queuedKeys : Set < K > ;
2221 readonly activeKeys : Set < K > ;
2322}
2423
25- export const makeCoalescingDrainableWorker = < K , V , E , R > ( options : {
24+ export const makeKeyedCoalescingWorker = < K , V , E , R > ( options : {
2625 readonly merge : ( current : V , next : V ) => V ;
2726 readonly process : ( key : K , value : V ) => Effect . Effect < void , E , R > ;
28- } ) : Effect . Effect < CoalescingDrainableWorker < K , V > , never , Scope . Scope | R > =>
27+ } ) : Effect . Effect < KeyedCoalescingWorker < K , V > , never , Scope . Scope | R > =>
2928 Effect . gen ( function * ( ) {
3029 const queue = yield * Effect . acquireRelease ( TxQueue . unbounded < K > ( ) , TxQueue . shutdown ) ;
31- const stateRef = yield * TxRef . make < CoalescingWorkerState < K , V > > ( {
30+ const stateRef = yield * TxRef . make < KeyedCoalescingWorkerState < K , V > > ( {
3231 latestByKey : new Map ( ) ,
3332 queuedKeys : new Set ( ) ,
3433 activeKeys : new Set ( ) ,
@@ -107,7 +106,7 @@ export const makeCoalescingDrainableWorker = <K, V, E, R>(options: {
107106 Effect . forkScoped ,
108107 ) ;
109108
110- const enqueue : CoalescingDrainableWorker < K , V > [ "enqueue" ] = ( key , value ) =>
109+ const enqueue : KeyedCoalescingWorker < K , V > [ "enqueue" ] = ( key , value ) =>
111110 TxRef . modify ( stateRef , ( state ) => {
112111 const latestByKey = new Map ( state . latestByKey ) ;
113112 const existing = latestByKey . get ( key ) ;
@@ -126,17 +125,7 @@ export const makeCoalescingDrainableWorker = <K, V, E, R>(options: {
126125 Effect . asVoid ,
127126 ) ;
128127
129- const drain : CoalescingDrainableWorker < K , V > [ "drain" ] = TxRef . get ( stateRef ) . pipe (
130- Effect . tap ( ( state ) =>
131- state . latestByKey . size > 0 || state . queuedKeys . size > 0 || state . activeKeys . size > 0
132- ? Effect . txRetry
133- : Effect . void ,
134- ) ,
135- Effect . asVoid ,
136- Effect . tx ,
137- ) ;
138-
139- const drainKey : CoalescingDrainableWorker < K , V > [ "drainKey" ] = ( key ) =>
128+ const drainKey : KeyedCoalescingWorker < K , V > [ "drainKey" ] = ( key ) =>
140129 TxRef . get ( stateRef ) . pipe (
141130 Effect . tap ( ( state ) =>
142131 state . latestByKey . has ( key ) || state . queuedKeys . has ( key ) || state . activeKeys . has ( key )
@@ -147,5 +136,5 @@ export const makeCoalescingDrainableWorker = <K, V, E, R>(options: {
147136 Effect . tx ,
148137 ) ;
149138
150- return { enqueue, drainKey, drain } satisfies CoalescingDrainableWorker < K , V > ;
139+ return { enqueue, drainKey } satisfies KeyedCoalescingWorker < K , V > ;
151140 } ) ;
0 commit comments