Effect CommunityEC
Effect Community•3y ago•
256 replies
mcsim1997

Taking 100 elements from a queue with fallback option

Hi!
I want to take 100 elements from a queue and if there are no N elements in the queue after 1 second, I want to fall back to taking up to 100. Here is my code:

const program = Effect.gen(function* (_) {
    const chunk = Chunk.range(0, 110);
    const queue = yield* _(Queue.unbounded<number>());
    yield* _(Queue.offerAll(chunk)(queue));
    console.log('queue size', yield* _(Queue.size(queue)));
    yield* _(
        Queue.takeN(100)(queue).pipe(Effect.timeout('1 seconds')),
        Effect.tap(() =>
            Effect.gen(function* (_) {
                console.log('queue size after taking 100 elements', yield* _(Queue.size(queue)));
            })
        ),
        Effect.orElse(() =>
            Effect.gen(function* (_) {
                console.log('queue size after timeout', yield* _(Queue.size(queue)));
                return yield* _(Queue.takeUpTo(100)(queue));
            })
        ),
        Effect.forever
    );
});

output:
queue size 111
queue size after taking 100 elements 11
queue size after timeout 0

I would expect the queue size to be 11 after the first timeout. Why is it 0? And how can I achieve such behavior? 🙂
Was this page helpful?