SpscQueue[T] = object
proc `=copy`[T](dest: var SpscQueue[T]; source: SpscQueue[T]) {.error.}
proc `=destroy`[T](self: var SpscQueue[T])
proc cap[T](self: SpscQueue[T]): int
proc init[T](self: out SpscQueue[T]; capacity: Natural)
proc len[T](self: SpscQueue[T]): int
proc newSpscQueue[T](cap: int): SpscQueue[T]
proc tryPop[T](self: var SpscQueue[T]; value: var T): bool
proc tryPush[T](self: var SpscQueue[T]; value: var Isolated[T]): bool {. nodestroy.}
template tryPush[T](self: SpscQueue[T]; value: T): bool