macroland/
lib.rs

1//! # Macroland
2//!
3//! Macroland is a Rust Crate, which provides macros for shorthand definitions
4//! of various types. Think how `vec!` is used to create empty, or filled up vectors.
5//! Macroland is full of various macros for this exact purpose.
6
7/// `arc!` produces an Arc<T> type! Enough said y'all!~~
8///
9/// # Example
10///
11/// ```
12/// use macroland::arc;
13///
14/// let my_arc = arc!(vec![1, 2, 3]);
15/// let std_arc = std::sync::Arc::new(vec![1, 2, 3]);
16///
17/// assert_eq!(my_arc, std_arc);
18/// ```
19#[macro_export]
20macro_rules! arc {
21    ($value:expr) => {{
22        use std::sync::Arc;
23
24        Arc::new($value)
25    }};
26}
27
28/// `arctex!` Creates an Arc<Mutex<T>>. Take a look at the example and see how quickly things get out of
29/// control! :O
30///
31/// # Example
32///
33/// ```
34/// use std::sync::{Arc, Mutex};
35///
36/// use macroland::arctex;
37///
38/// let my_arctex = arctex!(String::from("Chicken Wings!"));
39/// let std_arctex = Arc::new(Mutex::new(String::from("Chicken Wings!)));
40///
41/// assert_eq!(my_arctex, std_arctex);
42/// ```
43#[macro_export]
44macro_rules! arctex {
45    ($value:expr) => {{
46        use std::sync::{Arc, Mutex};
47
48        Arc::new(Mutex::new($value))
49    }};
50}
51
52/// `arclock!` Similar to the `arctex!` macro, this makes it simple to create an Arc<RwLock<T>>!
53///
54/// # Example
55///
56/// ```
57/// use std::sync::{Arc, RwLock};
58///
59/// use macroland::arclock;
60///
61/// let my_arclock = arclock!(true);
62/// let std_arclock = Arc::new(RwLock::new(true));
63///
64/// assert_eq!(my_arclock, std_arclock);
65/// ```
66#[macro_export]
67macro_rules! arclock {
68    ($value:expr) => {{
69        use std::sync::{Arc, RwLock};
70
71        Arc::new(RwLock::new($value))
72    }};
73}
74
75/// `binary_heap` creates a Binary Heap. You can either create an empty variant, with
76/// its type explicity given, or a list of values.
77///
78/// # Examples
79///
80/// ```
81/// use macroland::binary_heap;
82///
83/// let mut uninit_binary_heap = binary_heap!(usize);
84/// uninit_binary_heap.push(100);
85/// // Or
86/// let my_binary_heap: BinaryHeap<usize> = binary_heap!(100, 200, 300);
87///
88/// assert_eq!(uninit_binary_heap, my_binary_heap);
89/// ```
90#[macro_export]
91macro_rules! binary_heap {
92    ($value:ty) => {
93        {
94            use std::collections::BinaryHeap;
95
96            let new_binary_heap: BinaryHeap<$value> = BinaryHeap::new();
97            new_binary_heap
98        }
99    };
100
101    ( $($value:expr),* ) => {
102        {
103            use std::collections::BinaryHeap;
104
105            let mut new_binary_heap = BinaryHeap::new();
106            $( new_binary_heap.push($value); )*
107
108            new_binary_heap
109        }
110    };
111}
112
113/// `btreeset!` creates a BTreeSet. Like HashSet, you can predefine its members, or the
114/// type of its future members.
115///
116/// # Examples
117///
118/// ```
119/// use macroland::btreeset;
120///
121/// let mut uninit_btreeset = btreeset!(&str);
122/// uninit_btreeset.insert("Hello!");
123/// // Or
124/// let my_btreeset = btreeset!("Hello!");
125///
126/// assert_eq!(uninit_btreeset, my_btreeset);
127/// ```
128#[macro_export]
129macro_rules! btreeset {
130    ($value:ty) => {
131        {
132            use std::collections::BTreeSet;
133
134            let new_btreeset: BTreeSet<$value> = BTreeSet::new();
135            new_btreeset
136        }
137    };
138
139    ( $($value:expr),*) => {
140        {
141            use std::collections::BTreeSet;
142
143            let mut new_btreeset = BTreeSet::new();
144            $( new_btreeset.insert($value); )*
145
146            new_btreeset
147        }
148    };
149}
150
151/// `btreemap!` creates a BTreeMap. This can be done in two different ways.
152///
153/// # Examples
154///
155/// ```
156/// use macroland::btreemap;
157///
158/// let mut uninit_btreemap = btreemap!(&str, usize);
159/// uninit_btreemap.insert("Uno", 1);
160/// uninit_btreemap.insert("Dos", 2);
161/// uninit_btreemap.insert("Tres", 3);
162/// // Or
163/// let my_btreemap = btreemap!(
164///     "Uno" => 1,
165///     "Dos" => 2,
166///     "Tres" => 3
167/// );
168///
169/// assert_eq!(uninit_btreemap, my_btreemap);
170/// ```
171#[macro_export]
172macro_rules! btreemap {
173    ($key:ty, $value:ty) => {
174        {
175            use std::collections::BTreeMap;
176
177            let new_btreemap: BTreeMap<$key, $value> = BTreeMap::new();
178            new_btreemap
179        }
180    };
181
182    ($($key:expr => $value:expr),*) => {
183        {
184            use std::collections::BTreeMap;
185
186            let mut new_btreemap = BTreeMap::new();
187            $( new_btreemap.insert($key, $value); )*
188
189            new_btreemap
190        }
191    }
192}
193
194/// `boxed!` provides a simple way to box a given type, without using ::new() each
195/// time you want to.
196///
197/// # Example
198///
199/// ```
200/// use macroland::boxed;
201///
202/// let macroland_box = boxed!(Some(100));
203/// let normal_box = Box::new(Some(100));
204///
205/// assert_eq!(macroland_box, normal_box);
206/// ```
207#[macro_export]
208macro_rules! boxed {
209    ($value:expr) => {{
210        Box::new($value)
211    }};
212}
213
214/// `cell!` Tired of calling `new` all the time? Here you go!
215///
216/// # Example
217///
218/// ```
219/// use macroland::cell;
220///
221/// let macroland_cell = cell!("Hi friends!");
222/// let std_cell = std::cell::Cell::new("Uwu");
223///
224/// assert_eq!(macroland_cell, std_cell);
225/// ```
226#[macro_export]
227macro_rules! cell {
228    ($value:expr) => {{
229        use std::cell::Cell;
230
231        Cell::new($value)
232    }};
233}
234
235/// `hashset!` creates a HashSet. You can either define its members during the macro call,
236/// or create an empty HashSet with its type predefined.
237///
238/// # Examples
239///
240/// ```
241/// use macroland::hashset;
242///
243/// let mut uninit_hashset = hashset!(&str);
244/// uninit_hashset.insert("Hello!");
245/// // Or
246/// let my_hashset = hashset!("Hello!");
247///
248/// assert_eq!(uninit_hashset, my_hashset);
249/// ```
250#[macro_export]
251macro_rules! hashset {
252    ($value:ty) => {
253        {
254            use std::collections::HashSet;
255
256            let new_hashset: HashSet<$value> = HashSet::new();
257            new_hashset
258        }
259    };
260    ($($value:expr),*) => {
261        {
262            use std::collections::HashSet;
263
264            let mut new_hashset = HashSet::new();
265            $( new_hashset.insert($value); )*
266
267            new_hashset
268        }
269    };
270}
271
272/// `hashmap!` creates a HashMap. The OG is back, y'all... I'm kidding. I heard about there
273/// being a builtin `hashmap!` macro not too long ago, I guess I wasn't around then. So,
274/// this one is for all those who remember.
275///
276/// # Examples
277///
278/// ```
279/// use macroland::hashmap;
280///
281/// let mut uninit_hashmap = hashmap!(&str, usize);
282/// uninit_hashmap.insert("Uno", 1);
283/// uninit_hashmap.insert("Dos", 2);
284/// uninit_hashmap.insert("Tres", 3);
285/// // Or
286/// let my_hashmap = hashmap!(
287///     "Uno" => 1,
288///     "Dos" => 2,
289///     "Tres" => 3
290/// );
291///
292/// assert_eq!(uninit_hashmap, my_hashmap);
293/// ```
294#[macro_export]
295macro_rules! hashmap {
296    ($key:ty, $value:ty) => {
297        {
298            use std::collections::HashMap;
299
300            let new_map: HashMap<$key, $value> = HashMap::new();
301            new_map
302        }
303    };
304    ($($key:expr => $value:expr),*) => {
305        {
306            use std::collections::HashMap;
307
308            let mut new_map = HashMap::new();
309            $( new_map.insert($key, $value); )*
310
311            new_map
312        }
313    };
314}
315
316/// `linkedlist!` creates a LinkedList. Alike to the `vecdeque!` macro, all members are pushed
317/// to the front of the list, when predefined.
318///
319/// # Examples
320///
321/// ```
322/// use macroland::linkedlist;
323///
324/// let mut uninit_linkedlist = linkedlist!(isize);
325/// uninit_linkedlist.push_front(10);
326/// uninit_linkedlist.push_back(20);
327/// // Or
328/// let my_linkedlist = linkedlist!(
329///     10,
330///     20,
331///     30,
332/// );
333/// ```
334#[macro_export]
335macro_rules! linkedlist {
336    ($value:ty) => {
337        {
338            use std::collections::LinkedList;
339
340            let new_linkedlist: LinkedList<$value> = LinkedList::new();
341            new_linkedlist
342        }
343    };
344    ( $($value:expr),* ) => {
345        {
346            use std::collections::LinkedList;
347
348            let mut new_linkedlist = LinkedList::new();
349            $( new_linkedlist.push_front($value); )*
350
351            new_linkedlist
352        }
353    };
354}
355
356/// `mutex!` Wraps its input into a Mutex<T>
357///
358/// # Example
359///
360/// ```
361/// use macroland::mutex;
362///
363/// // Mutex moment!
364/// let macroland_mutex = mutex!("Hewwo!");
365/// let std_mutex = std::sync::Mutex::new("Hewwo!");
366///
367/// assert_eq!(macroland_mutex.lock().unwrap(), std_mutex.lock().unwrap());
368/// ```
369#[macro_export]
370macro_rules! mutex {
371    ($value:expr) => {{
372        use std::sync::Mutex;
373
374        Mutex::new($value)
375    }};
376}
377
378/// `oncecell!` Yup, here's a OnceCell<T> for you.
379///
380/// # Example
381///
382/// ```
383/// use macroland::oncecell;
384///
385/// // Create an empty OnceCell with a specified type!
386/// let empty_oncecell = oncecell!(String);
387/// empty_oncecell.set(String::from("You are not my friends anymore! :C"));
388/// ```
389#[macro_export]
390macro_rules! oncecell {
391    ($value_type:ty) => {{
392        use std::cell::OnceCell;
393
394        let new_oncecell: OnceCell<$value_type> = OnceCell::new();
395        new_oncecell
396    }};
397}
398
399/// `rwlock!` Time to lock and load Rustaceans!... I'm sorry.
400///
401/// # Example
402///
403/// ```
404/// use macroland::rwlock;
405///
406/// let macroland_rwlock = rwlock!(10_usize);
407/// let std_rwlock = std::sync::RwLock::new(10_usize);
408///
409/// assert_eq!(macroland_rwlock, std_rwlock);
410/// ```
411#[macro_export]
412macro_rules! rwlock {
413    ($value:expr) => {{
414        use std::sync::RwLock;
415
416        RwLock::new($value)
417    }};
418}
419
420/// `refcell!` `new` is so old school!
421///
422/// # Example
423///
424/// ```
425/// use macroland::refcell;
426///
427/// let macroland_refcell = refcell!("Hi friends!");
428/// let normal_refcell = std::cell::RefCell::new("Uwu");
429///
430/// assert_eq!(macroland_refcell, normal_refcell);
431/// ```
432#[macro_export]
433macro_rules! refcell {
434    ($value:expr) => {{
435        use std::cell::RefCell;
436
437        RefCell::new($value)
438    }};
439}
440
441/// `rc!` Reference Counting time!
442///
443/// # Example
444///
445/// ```
446/// use macroland::rc;
447///
448/// let macroland_rc = rc!("Hi friends!");
449/// let normal_rc = std::rc:Rc::new("Uwu");
450///
451/// assert_eq!(macroland_rc, normal_rc);
452/// ```
453#[macro_export]
454macro_rules! rc {
455    ($value:expr) => {{
456        use std::rc::Rc;
457
458        Rc::new($value)
459    }};
460}
461
462/// `vecdeque!` creates a VecDeque. Be warned, members are pushed into the *front* of the
463/// VecDeque<T> when predefining the members using this macro.
464///
465/// # Examples
466///
467/// ```
468/// use macroland::vecdeque;
469///
470/// let mut uninit_vecdeque = vecdeque!(&str);
471/// uninit_vecdeque.push_front("I'm going ahead!");
472/// uninit_vecdeque.push_back("I'm going behind!");
473/// // Or
474/// let my_vecdeque = vecdeque!(
475///     "I'm always going ahead!",
476///     "No matter how many members are pushed!",
477///     "Uwu",
478/// );
479/// ```
480#[macro_export]
481macro_rules! vecdeque {
482    ($value:ty) => {{
483        use std::collections::VecDeque;
484
485        let new_vecdeque: VecDeque<$value> = VecDeque::new();
486        new_vecdeque
487    }};
488    ( $($value:expr),* ) => {
489        {
490            use std::collections::VecDeque;
491
492            let mut new_vecdeque = VecDeque::new();
493            $(new_vecdeque.push_front($value); )*
494
495            new_vecdeque
496        }
497    };
498}