import { unsafeCompleteDeferred } from "@effect/core/io/Queue/operations/_internal/unsafeCompleteDeferred"
import { unsafeOfferAll } from "@effect/core/io/Queue/operations/_internal/unsafeOfferAll"
import { unsafePollAll } from "@effect/core/io/Queue/operations/_internal/unsafePollAll"
import type { Strategy } from "@effect/core/io/Queue/operations/strategy"
export function unsafeCompleteTakers(
strategy: Strategy,
queue: MutableQueue,
takers: MutableQueue>
): void {
// Check both a taker and an item are in the queue, starting with the taker
let keepPolling = true
while (keepPolling && !queue.isEmpty) {
const taker = takers.poll(EmptyMutableQueue)
if (taker !== EmptyMutableQueue) {
const element = queue.poll(EmptyMutableQueue)
if (element !== EmptyMutableQueue) {
unsafeCompleteDeferred(taker, element)
strategy.unsafeOnQueueEmptySpace(queue, takers)
} else {
unsafeOfferAll(takers, unsafePollAll(takers).prepend(taker))
}
keepPolling = true
} else {
keepPolling = false
}
}
}