1个稳定版本

1.0.0 2024年3月29日

#162 in 无标准库

Apache-2.0

13KB
194

🚰 水厂

waterworks是一个构建链式计算流水线的库,重点关注明确选择作为给定流水线的一部分,并提供快速方便地检查每个阶段的输出并对该输出进行操作以潜在地提前终止流水线的方式。

它被设计用于编译器的数据流,并在我的个人编译器项目catastrophic中投入“生产”使用。

用法

使用waterworks首先需要定义将要组合到整体计算流水线中的各个阶段。

阶段由流水线全局的Error类型、该特定阶段的输入和输出以及执行实际计算的run方法定义。

例如,如果我们正在构建编译器,我们可能会有一个初始的文件解析阶段,如下所示

struct FileParseStage;

impl Stage<CompileError> for FileParseStage {
    type Input = PathBuf;
    type Output = Ast;

    fn run(self, input: PathBuf) -> Result<Ast, CompileError> {
        parse_file(input)
    }
}

然后可以将这些组合成一个完整的流水线,链接到额外的编译阶段

let pipe = pipeline(FileParseStage, |_| ())
    .and_then(AstAnalysisStage, |_| ())
    .and_then(OptimisationStage, |_| ())
    .and_then(ComppilationStage, |_| ());

回调

流水线构建和链式方法都除了附加到流水线的阶段外还接受一个回调。这个回调可以用来检查相关阶段的输出并提前终止流水线的执行。

例如,如果你想要一个编译器标志,它只是记录解析器的输出然后返回,你可以在附加上面的FileParseStage时使用以下回调实现

|ast| if log_ast {
    println!("{:?}", ast);
    Continue::Cancel
} else {
    Continue::Continue
}

为了在简单情况下方便,返回()的闭包被视为显式返回Continue::Continue

运行

要运行流水线,只需调用run,传递第一个阶段的定义输入。这将返回流水线中最终阶段的输出、阶段返回的第一个错误或流水线是否提前取消。

let result = pipe.run("waterworks.rs");

无运行时依赖