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::*;