#non-empty #array-vec #slice #testing #repr #transparent #convert

无std nunny

为Rust编写的终极非空切片/数组/vec库

8个版本

0.2.1 2024年4月30日
0.2.0 2024年4月30日
0.1.4 2024年4月30日
0.0.0 2024年4月24日

#234Rust patterns

Download history 117/week @ 2024-04-22 721/week @ 2024-04-29 924/week @ 2024-05-06 832/week @ 2024-05-13 525/week @ 2024-05-20 366/week @ 2024-05-27 864/week @ 2024-06-03 597/week @ 2024-06-10 961/week @ 2024-06-17 572/week @ 2024-06-24 1196/week @ 2024-07-01 1020/week @ 2024-07-08 2045/week @ 2024-07-15 1012/week @ 2024-07-22 572/week @ 2024-07-29 1195/week @ 2024-08-05

4,847 每月下载量
用于 3 crates

MIT/Apache

200KB
2.5K SLoC

为Rust编写的终极非空切片/数组/vec库。

特性

构造非空API

let mut my_vec = NonEmpty::<Vec<_>>::of("hello"); // construct once
my_vec.push("world");                             // continue using your normal APIs
let hello: &str = my_vec.first();                 // preserve the guarantee that there is at least one element

#[repr(transparent)] 允许高级用例并保证最佳性能[^1]

let src = &mut ["hello", "world"];
let ne = NonEmpty::<[_]>::new_mut(src).unwrap();
//  ^ uses the same backing memory
let world: &str = ne.last();

API覆盖全面。对于 std 中的每个 FromTryFromPartialEqPartialOrd 实现,此库中都有相应的 SliceArrayVec 实现。这包括更复杂的类型

let nun: Box<NonEmpty<[_]>> = vec![0xDEAD, 0xBEEF].into();
let cow: Cow<NonEmpty<[_]>> = (&*nun).into();
let arc: Arc<NonEmpty<[_]>> = cow.into_owned().into();

const-友好API。尽可能所有方法都是 const

const TWO: &NonEmpty<[&str]> = slice!["together", "forever"];
const FIRST: &str = TWO.first();
const ONE: &NonEmpty<[&str]> = NonEmpty::<[_]>::of(&"lonely");

广泛的功能门控支持

  • 无std 环境,无分配器。
  • alloc 启用环境。
  • 完全 std 启用环境。
  • serdearbitrary 等crates交互。

迭代器支持:专门的 Iterator 方法删除分支以处理空迭代器,并且即使在组合器链中也保持不变量。

let v = vec![1, 2, 3];
let _: Option<&u8> = v.iter().last();
    // ^ normally you have to handle the empty case
let _: &u8 = v.iter_ne().last();
    // ^ but we know there is at least one element
let _: u8 = v.iter_ne().copied().last();
                     // ^ using this combinator preserves the invariant

深思熟虑的设计

[^1]: 其他类似 nonempty 的包需要间接引用。[^2]: 除了在 !#[fundamental] 类型的实现,如 Arc。有趣的事实:我们的测试是从 Rustdoc 的 [code]std[/code] 生成的!

依赖

~0–1MB
~18K SLoC