import type { Effect } from "@effect/core/io/Effect" import type { Dequeue } from "@effect/core/io/Queue/definition" import { _Out, QueueSym } from "@effect/core/io/Queue/definition" import type { Chunk } from "@tsplus/stdlib/collections/Chunk" import type { Maybe } from "@tsplus/stdlib/data/Maybe" class MapDequeueImpl implements Dequeue { constructor( readonly dequeue: Dequeue, readonly f: (a: A) => B ) {} get take(): Effect { return this.dequeue.take.map(this.f) } get takeAll(): Effect> { return this.dequeue.takeAll.map((all) => all.map(this.f)) } takeUpTo(this: this, max: number): Effect> { return this.dequeue.takeUpTo(max).map((upTo) => upTo.map(this.f)) } takeBetween(this: this, min: number, max: number): Effect> { return this.dequeue.takeBetween(min, max).map((upTo) => upTo.map(this.f)) } takeN(this: this, n: number): Effect> { return this.dequeue.takeN(n).map((upTo) => upTo.map(this.f)) } get poll(): Effect> { return this.dequeue.poll.map((m) => m.map(this.f)) } get [_Out](): (_: never) => B { return (a) => a } get capacity(): number { return this.dequeue.capacity } get size(): Effect { return this.dequeue.size } get awaitShutdown(): Effect { return this.dequeue.awaitShutdown } get isShutdown(): Effect { return this.dequeue.isShutdown } get shutdown(): Effect { return this.dequeue.shutdown } get isFull(): Effect { return this.dequeue.isFull } get isEmpty(): Effect { return this.dequeue.isEmpty } get [QueueSym](): QueueSym { return QueueSym } } export function mapDequeue(dequeue: Dequeue, f: (a: A) => B): Dequeue { return new MapDequeueImpl(dequeue, f) }