已发布 上游基线 bf46254 原文 ↗ 在 GitHub 编辑

简介

了解 Sink 在 Stream 处理中的角色:处理元素的消费、错误管理、结果的产出以及剩余元素。

在 Stream 处理中,Sink 是一种用于消费 Stream 所生成元素的结构。

     ┌─── Type of the result produced by the Sink
     |  ┌─── Type of elements consumed by the Sink
     |  |   ┌─── Type of any leftover elements
     │  |   |  ┌─── Type of possible errors
     │  │   |  |  ┌─── Type of required dependencies
     ▼  ▼   ▼  ▼  ▼
Sink<A, In, L, E, R>

下面是 Sink 所做事情的总览:

  • 它会消费数量不定的 In 元素,这个数量可以是零个、一个或多个。
  • 它在处理过程中可能遇到 E 类型的错误。
  • 它在处理完成后会产出一个 A 类型的结果。
  • 它还可能返回 L 类型的剩余部分,表示任何未被消费的元素。

要使用 Sink 处理一个 stream,你可以把它直接传给 Stream.run 函数:

示例(使用 Sink 收集 Stream 元素)

import { Stream, Sink, Effect } from "effect"

//      ┌─── Stream<number, never, never>
//      ▼
const stream = Stream.make(1, 2, 3)

// Create a sink to take the first 2 elements of the stream
//
//      ┌─── Sink<Chunk<number>, number, number, never, never>
//      ▼
const sink = Sink.take<number>(2)

// Run the stream through the sink to collect the elements
//
//      ┌─── Effect<number, never, never>
//      ▼
const sum = Stream.run(stream, sink)

Effect.runPromise(sum).then(console.log)
/*
Output:
{ _id: 'Chunk', values: [ 1, 2 ] }
*/

sink 的类型如下:

       ┌─── result
       |              ┌─── consumed elements
       |              |       ┌─── leftover elements
       │              |       |       ┌─── no errors
       │              │       |       |      ┌─── no dependencies
       ▼              ▼       ▼       ▼      ▼
Sink<Chunk<number>, number, number, never, never>

下面逐项说明:

  • Chunk<number>:Sink 处理完元素后产出的最终结果(在本例中,是一个由数字组成的 Chunk)。
  • number(第一次出现):Sink 将从 stream 中消费的元素类型。
  • number(第二次出现):未被消费的剩余元素(如果有的话)的类型。
  • never(第一次出现):表示这个 Sink 不会产生任何错误。
  • never(第二次出现):表示运行这个 Sink 不需要任何依赖。