/**
 * A common interface for controllable streams.
 *
 * @group Sources
 */
export interface Controllable<T> extends ReadableStreamDefaultController<T> {
  /**
   * Register a pull subscriber.
   *
   * When the stream is ready to pull it will pull from all
   * subscribers until the desired size has been fulfilled.
   */
  onPull(pullListener: ControllerPullListener<T>): () => void
}

/**
 * The pull listener type for controllables.
 *
 * @group Sources
 */
export interface ControllerPullListener<T> {
  (): T | Promise<T> | undefined
}

/**
 * An interface for a {@link ControllableStream:class}.
 *
 * @group Sources
 */
export interface ControllableReadableStream<T>
  extends ReadableStream<T>,
    Controllable<T> {}
