| 2578 | * @since 4.0.0 |
| 2579 | */ |
| 2580 | export class SlidingStrategy<in out A> implements PubSub.Strategy<A> { |
| 2581 | get shutdown(): Effect.Effect<void> { |
| 2582 | return Effect.void |
| 2583 | } |
| 2584 | |
| 2585 | handleSurplus( |
| 2586 | pubsub: PubSub.Atomic<A>, |
| 2587 | subscribers: PubSub.Subscribers<A>, |
| 2588 | elements: Iterable<A>, |
| 2589 | _isShutdown: MutableRef.MutableRef<boolean> |
| 2590 | ): Effect.Effect<boolean> { |
| 2591 | return Effect.sync(() => { |
| 2592 | this.slidingPublishUnsafe(pubsub, elements) |
| 2593 | this.completeSubscribersUnsafe(pubsub, subscribers) |
| 2594 | return true |
| 2595 | }) |
| 2596 | } |
| 2597 | |
| 2598 | onPubSubEmptySpaceUnsafe( |
| 2599 | _pubsub: PubSub.Atomic<A>, |
| 2600 | _subscribers: PubSub.Subscribers<A> |
| 2601 | ): void { |
| 2602 | // |
| 2603 | } |
| 2604 | |
| 2605 | completePollersUnsafe( |
| 2606 | pubsub: PubSub.Atomic<A>, |
| 2607 | subscribers: PubSub.Subscribers<A>, |
| 2608 | subscription: PubSub.BackingSubscription<A>, |
| 2609 | pollers: MutableList.MutableList<Deferred.Deferred<A>> |
| 2610 | ): void { |
| 2611 | return strategyCompletePollersUnsafe(this, pubsub, subscribers, subscription, pollers) |
| 2612 | } |
| 2613 | |
| 2614 | completeSubscribersUnsafe(pubsub: PubSub.Atomic<A>, subscribers: PubSub.Subscribers<A>): void { |
| 2615 | return strategyCompleteSubscribersUnsafe(this, pubsub, subscribers) |
| 2616 | } |
| 2617 | |
| 2618 | slidingPublishUnsafe(pubsub: PubSub.Atomic<A>, elements: Iterable<A>): void { |
| 2619 | const it = elements[Symbol.iterator]() |
| 2620 | let next = it.next() |
| 2621 | if (!next.done && pubsub.capacity > 0) { |
| 2622 | let a = next.value |
| 2623 | let loop = true |
| 2624 | while (loop) { |
| 2625 | pubsub.slide() |
| 2626 | const pub = pubsub.publish(a) |
| 2627 | if (pub && (next = it.next()) && !next.done) { |
| 2628 | a = next.value |
| 2629 | } else if (pub) { |
| 2630 | loop = false |
| 2631 | } |
| 2632 | } |
| 2633 | } |
| 2634 | } |
| 2635 | } |
| 2636 | |
| 2637 | const strategyCompletePollersUnsafe = <A>( |
nothing calls this directly
no outgoing calls
no test coverage detected