nonempty_containers/
macros.rs

1//! Macros for creating non-empty containers.
2
3/// Creates a [NonEmptyVec] containing the arguments.
4///
5/// This macro is very similar in goal to the standard library's `vec!` macro:
6///
7/// - Create a [NonEmptyVec] containing a given list of elements:
8///
9/// ```
10/// # use nonempty_containers::nev;
11/// #
12/// let ne = nev![1, 2, 3];
13/// assert_eq!(ne[0], 1);
14/// assert_eq!(ne[1], 2);
15/// assert_eq!(ne[2], 3);
16/// ```
17///
18/// - Create a [NonEmptyVec] from a given head element and tail vector.
19///
20/// ```
21/// # use nonempty_containers::{nev, NEVec};
22/// #
23/// let vec = vec![2, 3, 4];
24/// let ne = nev![1; vec];
25/// assert_eq!(ne, NEVec::from_vec(vec![1, 2, 3, 4]).unwrap());
26/// ```
27///
28/// Note that unlike [Vec]s, it is not possible to create an empty [NonEmptyVec] using this macro!
29#[macro_export]
30macro_rules! nev {
31    ($elem:expr; $n:expr) => (
32        $crate::NEVec::new($elem, $n)
33    );
34    ($single:expr) => (
35        $crate::NEVec::singleton($single)
36    );
37    ($head:expr, $($tail:expr),+ $(,)?) => (
38        $crate::NEVec::new($head, vec![$($tail),+])
39    );
40}
41
42#[macro_export]
43macro_rules! nes {
44    ($elem:expr; $n:expr) => (
45        $crate::NESet::new($elem, $n)
46    );
47    ($single:expr) => (
48        $crate::NESet::singleton($single)
49    );
50    ($head:expr, $($tail:expr),+ $(,)?) => (
51        $crate::NESet::new($head, vec![$($tail),+])
52    );
53}
54
55#[macro_export]
56macro_rules! neos {
57    ($elem:expr; $n:expr) => (
58        $crate::NEOrderedSet::new($elem, $n)
59    );
60    ($single:expr) => (
61        $crate::NEOrderedSet::singleton($single)
62    );
63    ($head:expr, $($tail:expr),+ $(,)?) => (
64        $crate::NEOrderedSet::new($head, vec![$($tail),+])
65    );
66}