Hyperlinkv0.8.0-beta.28

PubSub

PubSub.takeUpToconsteffect/PubSub.ts:1287
(max: number): <A>(self: Subscription<A>) => Effect.Effect<Array<A>>
<A>(self: Subscription<A>, max: number): Effect.Effect<Array<A>>

Takes up to the specified number of messages from the subscription without suspending.

Example (Taking up to a maximum number of messages)

import { Effect, PubSub } from "effect"

const program = Effect.gen(function*() {
  const pubsub = yield* PubSub.bounded<string>(10)

  yield* Effect.scoped(Effect.gen(function*() {
    const subscription = yield* PubSub.subscribe(pubsub)

    // Publish multiple messages
    yield* PubSub.publishAll(pubsub, ["msg1", "msg2", "msg3", "msg4", "msg5"])

    // Take up to 3 messages
    const upTo3 = yield* PubSub.takeUpTo(subscription, 3)
    console.log("Up to 3:", upTo3) // ["msg1", "msg2", "msg3"]

    // Take up to 5 more (only 2 remaining)
    const upTo5 = yield* PubSub.takeUpTo(subscription, 5)
    console.log("Up to 5:", upTo5) // ["msg4", "msg5"]

    // No more messages available
    const noMore = yield* PubSub.takeUpTo(subscription, 10)
    console.log("No more:", noMore) // []
  }))
})
subscriptions
Source effect/PubSub.ts:128719 lines
export const takeUpTo: {
  (max: number): <A>(self: Subscription<A>) => Effect.Effect<Array<A>>
  <A>(self: Subscription<A>, max: number): Effect.Effect<Array<A>>
} = dual(2, <A>(self: Subscription<A>, max: number): Effect.Effect<Array<A>> =>
  Effect.suspend(() => {
    if (self.shutdownFlag.current) return Effect.interrupt
    let replay: Array<A> | undefined = undefined
    if (self.replayWindow.remaining >= max) {
      return Effect.succeed(self.replayWindow.takeN(max))
    } else if (self.replayWindow.remaining > 0) {
      replay = self.replayWindow.takeAll()
      max = max - replay.length
    }
    const as = self.pollers.length === 0
      ? self.subscription.pollUpTo(max)
      : []
    self.strategy.onPubSubEmptySpaceUnsafe(self.pubsub, self.subscribers)
    return replay ? Effect.succeed(replay.concat(as)) : Effect.succeed(as)
  }))