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}