流处理与增量 I/O 中的简单流转换
1. 流处理器与 Pull 数据类型
在进行 I/O 操作时,为了恢复我们熟悉的高级风格,引入了流处理器的概念。流处理器指定了从一个流到另一个流的转换,这里的流是一个通用术语,可指任何序列,可能是惰性生成的,也可能由外部源提供,如文件中的行、HTTP 请求、鼠标点击位置等。
为了表达流转换,我们引入了一个简单的数据类型 Pull :
enum Pull[+O, +R]:
case Result[+R](result: R) extends Pull[Nothing, R]
case Output[+O](value: O) extends Pull[O, Unit]
case FlatMap[X, +O, +R](
source: Pull[O, X],
f: X => Pull[O, R]
) extends Pull[O, R]
def step: Either[R, (O, Pull[O, R])] = this match
case Result(r) => Left(r)
case Output(o) => Right((o, Pull.done))
case FlatMap(source, f) =>
source match
case FlatMap(s2, g) =>
s2.flatMap(x => g(x).flatMap(y => f(y))).step
case ot
超级会员免费看
订阅专栏 解锁全文
84

被折叠的 条评论
为什么被折叠?



