sloth/lib.rs
1//! This crate provides a generic pointer-like [`Lazy<T, Eval>`](struct.Lazy.html) struct for lazily initialized values.
2//! It can be used for expensive-to-calculate values to ensure that the evaluation logic runs
3//! only once and only if needed.
4//!
5//! For example:
6//! ```
7//! use sloth::Lazy;
8//!
9//! fn get_expensive_string() -> String {
10//! // do something expensive here to obtain the result,
11//! // such as read and process file contents
12//! String::from("some expensive string we got from a file or something")
13//! }
14//!
15//! fn get_expensive_number() -> i32 {
16//! // do something expensive here to calculate the result,
17//! // such as build a supercomputer and wait 7.5 million years
18//! 42
19//! }
20//!
21//! let lazy_string = Lazy::new(get_expensive_string);
22//! let lazy_number = Lazy::new(get_expensive_number);
23//!
24//! //...
25//! let must_use_string = true;
26//! //...
27//!
28//! if must_use_string {
29//! println!("Expensive string is: {}", *lazy_string);
30//! println!("It has length: {}", lazy_string.len());
31//!
32//! // get_expensive_string() has been called only once,
33//! // get_expensive_number() has not been called
34//! } else {
35//! println!("Expensive number is: {}", *lazy_number);
36//! println!("Its square is {}", lazy_number.pow(2));
37//!
38//! // get_expensive_string() has not been called,
39//! // get_expensive_number() has been called only once
40//! }
41//!
42//! ```
43//!
44//! The evaluated value of a mutable [`Lazy`](struct.Lazy.html) can be modified:
45//! ```
46//! use sloth::Lazy;
47//!
48//! let mut lazy_vec = Lazy::new(|| vec![2, -5, 6, 0]);
49//!
50//! lazy_vec.retain(|n| *n > 0);
51//!
52//! assert_eq!(*lazy_vec, vec![2, 6]);
53//! ```
54//!
55//! [`Lazy`](struct.Lazy.html) can be consumed and turned into its value via [`unwrap()`](struct.Lazy.html#method.unwrap):
56//! ```
57//! use sloth::Lazy;
58//!
59//! let lazy_value = Lazy::new(|| "moo");
60//!
61//! let output = String::from("a cow goes ") + lazy_value.unwrap();
62//! ```
63
64//
65// Modules
66//
67
68mod lazy;
69
70// Unit tests
71#[cfg(test)]
72#[allow(deprecated)]
73mod tests;
74
75//
76// Exports
77//
78
79pub use lazy::Lazy;