const test = Effect.gen(function* (_) {
const queue = yield* Queue.unbounded<number>();
const producerFiber = yield* _(
produce({ queue }),
Effect.schedule(
Schedule.fixed("2 seconds").pipe(Schedule.compose(Schedule.recurs(5)))
),
Effect.fork
);
const consumerFiber = yield* _(
consume({ queue }),
Effect.forever,
Effect.fork
);
yield* Fiber.join(producerFiber);
yield* Effect.log("producer stopped");
yield* Effect.repeat(
Effect.gen(function* (_) {
const isEmpty = yield* _(Queue.isEmpty(queue));
if (isEmpty) {
yield* Effect.log("queue is empty");
yield* Fiber.interrupt(consumerFiber);
}
return isEmpty;
}),
{ until: (r) => r }
);
});
const produce = ({ queue }: { queue: Queue.Queue<number> }) =>
Effect.gen(function* (_) {
yield* Effect.log("producing");
yield* queue.offerAll([1, 2, 3]);
});
const consume = ({ queue }: { queue: Queue.Queue<number> }) =>
Effect.gen(function* (_) {
const value = yield* _(Queue.poll(queue));
if (Option.isNone(value)) {
return;
}
yield* Effect.log(`Consumed value '${value.value}'`);
});
const test = Effect.gen(function* (_) {
const queue = yield* Queue.unbounded<number>();
const producerFiber = yield* _(
produce({ queue }),
Effect.schedule(
Schedule.fixed("2 seconds").pipe(Schedule.compose(Schedule.recurs(5)))
),
Effect.fork
);
const consumerFiber = yield* _(
consume({ queue }),
Effect.forever,
Effect.fork
);
yield* Fiber.join(producerFiber);
yield* Effect.log("producer stopped");
yield* Effect.repeat(
Effect.gen(function* (_) {
const isEmpty = yield* _(Queue.isEmpty(queue));
if (isEmpty) {
yield* Effect.log("queue is empty");
yield* Fiber.interrupt(consumerFiber);
}
return isEmpty;
}),
{ until: (r) => r }
);
});
const produce = ({ queue }: { queue: Queue.Queue<number> }) =>
Effect.gen(function* (_) {
yield* Effect.log("producing");
yield* queue.offerAll([1, 2, 3]);
});
const consume = ({ queue }: { queue: Queue.Queue<number> }) =>
Effect.gen(function* (_) {
const value = yield* _(Queue.poll(queue));
if (Option.isNone(value)) {
return;
}
yield* Effect.log(`Consumed value '${value.value}'`);
});