1 个不稳定版本
0.0.1 | 2022年1月31日 |
---|
#25 在 #data-driven
38KB
567 行
linotype
一个可选固定值的键序列重投影器。
它可以作为数据驱动 GUI 的列表状态协调器。
更一般地说,这个库可以用来管理变化序列中与项关联的状态。
受众
此crate针对灵活使用进行了优化(只需为键 Eq
提供 Eq
,具有自动键缓存和灵活的生命周期),并且相对较低的入口计数。
如果您正在寻找具有许多项的列表的关联状态协调,尤其是在重投影之间对列表进行大更改时,可能需要不同的方法。
安装
请使用 cargo-edit 总是添加此库的最新版本
cargo add linotype --features std
功能
(更多信息请参阅 文档)
"std"
避免在固定 OwnedProjection
内部的键或值丢弃实现崩溃时终止进程。
示例
use linotype::OwnedProjection;
// This is tricky to write as closure except directly as parameter.
// See the `higher-order-closure` in the dependencies for a workaround.
fn selector<'a>(item: &'a mut &'static str) -> &'a str {
item
}
let mut counter = (0..).into_iter();
let mut factory = move |_item: &mut _, _k: &_| {
counter.next().unwrap()
};
// Inferred to store `String` keys (`K`) and `{integer}` values (`V`).
let mut linotype = OwnedProjection::new();
let mut reproject = |iter: &[&'static str]| linotype
.reproject_by_with(
iter.into_iter().copied(), // : IntoIter<Item = T>, here: T = &'static str
selector, // : FnMut(&mut T) -> &Q,
&mut factory, // : FnMut(&mut T, &K) -> V,
)
.map(|(_item, value)| *value)
.collect::<Vec<_>>(); // Left-over values are dropped here. Their slots are recycled.
assert_eq!(reproject(&["a", "b", "c"]), vec![0, 1, 2]);
assert_eq!(reproject(&["a", "b", "c", "d"]), vec![0, 1, 2, 3]);
assert_eq!(reproject(&["a", "b", "c"]), vec![0, 1, 2]);
assert_eq!(reproject(&["a", "b", "c", "d"]), vec![0, 1, 2, 4]);
assert_eq!(reproject(&["e", "c", "b", "a"]), vec![5, 2, 1, 0]);
// Reprojection methods for fallible closures and per-item closures are also available.
许可
根据以下任一项许可
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
您可以选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,旨在包含在作品中,均应如上所述双重许可,不附加任何其他条款或条件。
有关更多信息,请参阅 CONTRIBUTING
行为准则
变更日志
版本控制
linotype
严格遵循 Semantic Versioning 2.0.0,但有以下例外
- 次要版本在主要版本更改时不会重置为 0(除非为 v1)。
请将其视为全局功能级别。 - 在主版本或次版本更改时,补丁版本不会重置为0(除非是v0.1和v1)。
请将其视为全局补丁级别。
这包括上面指定的Rust版本要求。
较早的Rust版本可能兼容,但随着次版本或补丁版本的发布可能会发生变化。
受功能和补丁影响的具体版本,可以从CHANGELOG.md中的相应标题确定。
请注意,此crate的依赖项可能具有更宽松的MSRV策略!如果您不手动生成Cargo.lock(或根据需要生成)并且需要支持比当前稳定版更旧的编译器,请在您的自动化脚本中使用cargo +nightly update -Z minimal-versions
。
依赖项
~105KB