import { STMInterruptException } from "@effect/core/stm/STM"
import { concreteTDequeue } from "@effect/core/stm/THub/operations/_internal/InternalTDequeue"
/**
* Views the next element in the queue without removing it, returning `None`
* if the queue is empty.
*
* @tsplus getter effect/core/stm/THub/TDequeue peekMaybe
*/
export function peekMaybe(self: THub.TDequeue): STM> {
concreteTDequeue(self)
return STM.Effect((journal, fiberId) => {
let currentSubscriberHead = self.subscriberHead.unsafeGet(journal)
if (currentSubscriberHead == null) {
throw new STMInterruptException(fiberId)
}
let a: Maybe = Maybe.none
let loop = true
while (loop) {
const node = currentSubscriberHead.unsafeGet(journal)
if (node == null) {
a = Maybe.none
loop = false
} else {
const head = node.head
const tail = node.tail
if (head != null) {
a = Maybe.some(node.head)
loop = false
} else {
currentSubscriberHead = tail
}
}
}
return a
})
}