Skip to main content

fp_library/classes/
send_deferrable.rs

1//! Deferred lazy evaluation using thread-safe thunks.
2//!
3//! ### Examples
4//!
5//! ```
6//! use fp_library::{
7//! 	brands::*,
8//! 	functions::*,
9//! 	types::*,
10//! };
11//!
12//! let memo: ArcLazy<i32> = send_defer(|| ArcLazy::new(|| 42));
13//! assert_eq!(*memo.evaluate(), 42);
14//! ```
15
16#[fp_macros::document_module]
17mod inner {
18	use fp_macros::*;
19	/// A trait for deferred lazy evaluation with thread-safe thunks.
20	///
21	/// This is similar to [`Deferrable`](crate::classes::Deferrable), but the thunk must be `Send + Sync`.
22	#[document_type_parameters("The lifetime of the computation.")]
23	pub trait SendDeferrable<'a> {
24		/// Creates a deferred value from a thread-safe thunk.
25		#[document_signature]
26		///
27		#[document_parameters("The function that produces the value.")]
28		///
29		#[document_returns("A deferred value.")]
30		#[document_examples]
31		///
32		/// ```
33		/// use fp_library::{
34		/// 	brands::*,
35		/// 	functions::*,
36		/// 	types::*,
37		/// };
38		///
39		/// let memo: ArcLazy<i32> = send_defer(|| ArcLazy::new(|| 42));
40		/// assert_eq!(*memo.evaluate(), 42);
41		/// ```
42		fn send_defer(f: impl FnOnce() -> Self + Send + Sync + 'a) -> Self
43		where
44			Self: Sized;
45	}
46
47	/// Creates a deferred value from a thread-safe thunk.
48	///
49	/// Free function version that dispatches to [the type class' associated function][`SendDeferrable::send_defer`].
50	#[document_signature]
51	///
52	#[document_type_parameters(
53		"The lifetime of the computation",
54		"The type of the deferred value."
55	)]
56	///
57	#[document_parameters("The function that produces the value.")]
58	///
59	#[document_returns("A deferred value.")]
60	#[document_examples]
61	///
62	/// ```
63	/// use fp_library::{
64	/// 	brands::*,
65	/// 	functions::*,
66	/// 	types::*,
67	/// };
68	///
69	/// let memo: ArcLazy<i32> = send_defer(|| ArcLazy::new(|| 42));
70	/// assert_eq!(*memo.evaluate(), 42);
71	/// ```
72	pub fn send_defer<'a, D: SendDeferrable<'a>>(f: impl FnOnce() -> D + Send + Sync + 'a) -> D {
73		D::send_defer(f)
74	}
75}
76
77pub use inner::*;