import { concreteTDequeue } from "@effect/core/stm/THub/operations/_internal/InternalTDequeue"
/**
* Shuts down the queue.
*
* @tsplus getter effect/core/stm/THub/TDequeue shutdown
*/
export function shutdown(self: THub.TDequeue): STM {
concreteTDequeue(self)
return STM.Effect((journal) => {
let currentSubscriberHead = self.subscriberHead.unsafeGet(journal)
if (currentSubscriberHead != null) {
self.subscriberHead.unsafeSet(undefined, journal)
let loop = true
while (loop) {
const node = currentSubscriberHead.unsafeGet(journal)
if (node == null) {
loop = false
} else {
const head = node.head
const tail = node.tail
if (head != null) {
const subscribers = node.subscribers
if (subscribers == 1) {
const size = self.hubSize.unsafeGet(journal)
const updatedNode = THub.Node(undefined, 0, node.tail)
currentSubscriberHead.unsafeSet(updatedNode, journal)
self.publisherHead.unsafeSet(tail, journal)
self.hubSize.unsafeSet(size - 1, journal)
} else {
const updatedNode = THub.Node(undefined, subscribers - 1, node.tail)
currentSubscriberHead.unsafeSet(updatedNode, journal)
}
}
currentSubscriberHead = tail
}
}
const currentSubscriberCount = self.subscriberCount.unsafeGet(journal)
self.subscriberCount.unsafeSet(currentSubscriberCount - 1, journal)
self.subscribers.unsafeSet(self.subscribers.unsafeGet(journal) - self.subscriberHead, journal)
}
})
}