#non-empty #container #functional

nonempty-containers

Fast, zero-cost conversion, and fully inter-operable nonempty container types

13 releases

new 0.2.3 Mar 9, 2025
0.2.2 Mar 9, 2025
0.1.4 Mar 9, 2025
0.0.6 Mar 8, 2025
0.0.4 Feb 8, 2025

#837 in Data structures

Download history 342/week @ 2025-02-04 158/week @ 2025-02-11 65/week @ 2025-02-18 473/week @ 2025-02-25 1317/week @ 2025-03-04

2,052 downloads per month

MIT license

24KB
436 lines

Non-Empty Containers

A simple set of non-empty alternatives to standard containers in Rust, including NonEmptyVec.

Getting Started

Add this to your Cargo.toml:

# Cargo.toml

[dependencies]
nonempty-containers = "0.0.3"

The non-empty containers behave like their standard counterparts:

use nonempty_containers::NonEmptyVec;

let nev = NonEmptyVec::new(42, vec![1]);

nev.push(2);
nev.pop();
nev.pop();
assert_eq!(nev, NonEmptyVec::singleton(42));

// Errors!
nev.pop();

Automatically Deriving Arbitrary

All non-empty containers can automatically derive Arbitrary, so long as the contained type also implements Arbitrary. This is useful for property-based testing, such as with arbtest.

# Cargo.toml

[dependencies]
nonempty-containers = { version = "0.0.2", features = ["arbitrary"] }

And then you can simply add #[derive(Arbitrary)] annotations to your types:

// pixels.rs

use arbitrary::Arbitrary;

#[derive(Arbitrary)]
pub struct Items(NonEmptyVec<u32>);

Dependencies

~0–370KB