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日 |
#234 在 Rust patterns
4,847 每月下载量
用于 3 crates
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
中的每个 From
、TryFrom
、PartialEq
和 PartialOrd
实现,此库中都有相应的 Slice
、Array
和 Vec
实现。这包括更复杂的类型
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
启用环境。 - 与
serde
和arbitrary
等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
深思熟虑的设计
NonZeroUsize
插入到合适的位置。- 所有
Deref
/DerefMut
都转换为一个NonEmpty<Slice<T>>
,然后它会进一步通过deref/mut
转换为一个[T]
。 - 广泛使用
cmp
、borrow
、convert
特性。如果您缺少某个 API,请提出问题!
[^1]: 其他类似 nonempty
的包需要间接引用。[^2]: 除了在 !#[fundamental]
类型的实现,如 Arc
。有趣的事实:我们的测试是从 Rustdoc 的 [code]std[/code] 生成的!
依赖
~0–1MB
~18K SLoC