#pin #map #data-driven #stateful #reprojection

无 std linotype

一个可选固定值的键序列重投影器。(一个稳定的、事务性增量多映射。)

1 个不稳定版本

0.0.1 2022年1月31日

#25#data-driven

MIT/Apache

38KB
567

linotype

Lib.rs Crates.io Docs.rs

Rust 1.56 CI Crates.io - License

GitHub open issues open pull requests good first issues

crev reviews Zulip Chat

一个可选固定值的键序列重投影器。

它可以作为数据驱动 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-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