简介
了解 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 不需要任何依赖。