17 个版本
0.2.2 | 2023年6月10日 |
---|---|
0.2.1 | 2016年10月4日 |
0.2.0 | 2016年2月14日 |
0.1.2 | 2015年10月1日 |
0.0.7 | 2015年3月27日 |
#260 in Rust 模式
65 每月下载量
用于 8 crates
85KB
1.5K SLoC
Carboxyl 是 Rust 中用于函数式反应式编程的库,是一种处理交互式应用中事件的函数式和可组合方法。更多内容请参阅 文档…
使用示例
以下是一个如何使用 Carboxyl 提供的原始类型的简单示例。首先,事件可以被发送到 汇合点。从一个汇合点可以创建一个事件 流。流也可以被过滤、映射和合并。一个 信号 是一个值可能会随时间变化的抽象。例如,可以将流的最后一个事件存储在信号中。
extern crate carboxyl;
fn main() {
let sink = carboxyl::Sink::new();
let stream = sink.stream();
let signal = stream.hold(3);
// The current value of the signal is initially 3
assert_eq!(signal.sample(), 3);
// When we fire an event, the signal get updated accordingly
sink.send(5);
assert_eq!(signal.sample(), 5);
}
也可以直接遍历流,而不是将其存储在信号中
extern crate carboxyl;
fn main() {
let sink = carboxyl::Sink::new();
let stream = sink.stream();
let mut events = stream.events();
sink.send(4);
assert_eq!(events.next(), Some(4));
}
可以使用各种原始类型将流和信号组合起来。我们可以使用一个函数将一个流映射到另一个流
extern crate carboxyl;
fn main() {
let sink = carboxyl::Sink::new();
let stream = sink.stream();
let squares = stream.map(|x| x * x).hold(0);
sink.send(4);
assert_eq!(squares.sample(), 16);
}
或者我们可以过滤一个流以创建一个新的流,该流仅包含满足特定谓词的事件
extern crate carboxyl;
fn main() {
let sink = carboxyl::Sink::new();
let stream = sink.stream();
let negatives = stream.filter(|&x| x < 0).hold(0);
// This won't arrive at the signal.
sink.send(4);
assert_eq!(negatives.sample(), 0);
// But this will!
sink.send(-3);
assert_eq!(negatives.sample(), -3);
}
还有一些其他原始类型可以组合流和信号
merge
合并相同类型的事件流。- 每当流触发一个事件时,对信号进行
snapshot
。 lift!
将普通函数提升为信号上的函数。switch
使用包含信号的信号在不同的信号之间切换。
请参阅 文档 获取详细信息。
许可证
版权所有 2014-2020 Carboxyl 贡献者。
此源代码形式受 Mozilla 公共许可证第 2.0 版的条款约束。如果未随此文件分发 MPL 复制品,您可以从中获得一份: http://mozilla.org/MPL/2.0/。
依赖项
~0–1.3MB
~17K SLoC