Hyperlinkv0.8.0-beta.28

Stream

Stream.fromEventListenerconsteffect/Stream.ts:1591
<A = unknown>(
  target: EventListener<A>,
  type: string,
  options?:
    | boolean
    | {
        readonly capture?: boolean
        readonly passive?: boolean
        readonly once?: boolean
        readonly bufferSize?: number | undefined
      }
    | undefined
): Stream<A>

Creates a stream from an event listener.

Example (Creating a stream from an event listener)

import { Effect, Stream } from "effect"

class NumberTarget implements Stream.EventListener<number> {
  addEventListener(event: string, f: (event: number) => void) {
    if (event === "data") {
      f(1)
      f(2)
      f(3)
    }
  }
  removeEventListener(_event: string, _f: (event: number) => void) {}
}

Effect.runPromise(Effect.gen(function*() {
  const stream = Stream.fromEventListener(new NumberTarget(), "data").pipe(
    Stream.take(3)
  )
  const values = yield* Stream.runCollect(stream)
  yield* Effect.sync(() => console.log(values))
}))

// [ 1, 2, 3 ]
constructors
Source effect/Stream.ts:159119 lines
export const fromEventListener = <A = unknown>(
  target: EventListener<A>,
  type: string,
  options?: boolean | {
    readonly capture?: boolean
    readonly passive?: boolean
    readonly once?: boolean
    readonly bufferSize?: number | undefined
  } | undefined
): Stream<A> =>
  callback<A>((queue) => {
    function emit(event: A) {
      Queue.offerUnsafe(queue, event)
    }
    return Effect.acquireRelease(
      Effect.sync(() => target.addEventListener(type, emit, options)),
      () => Effect.sync(() => target.removeEventListener(type, emit, options))
    )
  }, { bufferSize: typeof options === "object" ? options.bufferSize : undefined })