1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
// =============================================================================
// Copyright (c) 2025 - 2026 Haixing Hu.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0.
// =============================================================================
//! # Supplier Types
//!
//! Provides stateless supplier implementations that generate and
//! return values without taking input.
//!
//! # Overview
//!
//! A **Supplier** is a functional abstraction equivalent to
//! `Fn() -> T`: it generates values without accepting input or
//! requiring mutable access to itself. The `get` method uses `&self`,
//! enabling use in read-only contexts and lock-free concurrent access
//! for the `Arc` implementation.
//!
//! For generators that need mutable internal state, such as counters
//! or sequences, use `StatefulSupplier`.
//!
//! # Key Differences from StatefulSupplier
//!
//! | Aspect | `Supplier<T>` | `StatefulSupplier<T>` |
//! |--------|---------------|----------------------|
//! | self signature | `&self` | `&mut self` |
//! | Closure type | `Fn() -> T` | `FnMut() -> T` |
//! | Receiver required to call | Shared (`&self`) | Mutable (`&mut self`) |
//! | Arc implementation | `Arc<dyn Fn() -> T + Send + Sync>` | `Arc<Mutex<dyn FnMut() -> T + Send>>` |
//! | Use cases | Factory, constant, high concurrency | Counter, sequence, generator |
//!
//! # Three Implementations
//!
//! - **`BoxSupplier<T>`**: Single ownership using `Box<dyn Fn() -> T>`. It uses
//! one heap allocation and dynamic dispatch and cannot be cloned.
//!
//! - **`ArcSupplier<T>`**: Thread-safe shared ownership using `Arc<dyn Fn() ->
//! T + Send + Sync>`. **Lock-free** - no Mutex needed! Can be cloned and sent
//! across threads with excellent performance.
//!
//! - **`RcSupplier<T>`**: Single-threaded shared ownership using `Rc<dyn Fn()
//! -> T>`. Can be cloned but not sent across threads. Lightweight alternative
//! to `ArcSupplier`.
//!
//! # Use Cases
//!
//! ## 1. Calling in `&self` Methods
//!
//! ```rust
//! use qubit_function::{ArcSupplier, Supplier};
//!
//! struct Executor<E> {
//! error_supplier: ArcSupplier<E>,
//! }
//!
//! impl<E> Executor<E> {
//! fn execute(&self) -> Result<(), E> {
//! // Can call directly in &self method!
//! Err(self.error_supplier.get())
//! }
//! }
//! ```
//!
//! ## 2. High-Concurrency Lock-Free Access
//!
//! ```rust
//! use qubit_function::{ArcSupplier, Supplier};
//! use std::thread;
//!
//! let factory = ArcSupplier::new(|| {
//! String::from("Hello, World!")
//! });
//!
//! let handles: Vec<_> = (0..10)
//! .map(|_| {
//! let f = factory.clone();
//! thread::spawn(move || f.get()) // Lock-free!
//! })
//! .collect();
//!
//! for h in handles {
//! assert_eq!(h.join().expect("thread should not panic"), "Hello, World!");
//! }
//! ```
//!
//! ## 3. Fixed Factories
//!
//! ```rust
//! use qubit_function::{BoxSupplier, Supplier};
//!
//! #[derive(Clone)]
//! struct Config {
//! timeout: u64,
//! }
//!
//! let config_factory = BoxSupplier::new(|| Config {
//! timeout: 30,
//! });
//!
//! assert_eq!(config_factory.get().timeout, 30);
//! assert_eq!(config_factory.get().timeout, 30);
//! ```
//!
//! # Concurrency Characteristics
//!
//! For stateless scenarios in multi-threaded environments:
//!
//! - `ArcStatefulSupplier<T>`: Requires `Mutex`, lock contention on every
//! `get()` call.
//! - `ArcSupplier<T>`: Lock-free, can call `get()` concurrently without
//! contention.
//!
//! Actual performance depends on the callback and contention pattern; measure
//! the workload when the distinction matters.
pub use BoxSupplier;
pub use ArcSupplier;
pub use RcSupplier;
// ======================================================================
// Supplier Trait
// ======================================================================
/// Shared-receiver supplier trait: generates values without input.
///
/// The core abstraction for value generation through `&self`. Unlike
/// `StatefulSupplier<T>`, it does not require `&mut self`, enabling usage in
/// shared-reference contexts and wrapper-level lock-free concurrent access.
/// The `Fn` shape does not imply purity: callbacks may use interior mutability
/// or external side effects.
///
/// # Key Characteristics
///
/// - **No input parameters**: The caller supplies no arguments
/// - **Shared-receiver calls**: Uses `Fn`, so invocation does not require `&mut
/// self`; interior mutability and external side effects remain possible
/// - **Returns ownership**: Returns `T` (not `&T`) to avoid lifetime issues
/// - **Lock-free concurrency**: `Arc` implementation doesn't need `Mutex`
///
/// # Automatically Implemented for Closures
///
/// All `Fn() -> T` closures automatically implement this trait,
/// enabling seamless integration with both raw closures and
/// wrapped supplier types.
///
/// # Examples
///
/// ## Using with Generic Functions
///
/// ```rust
/// use qubit_function::{Supplier, BoxSupplier};
///
/// fn call_twice<S: Supplier<i32>>(supplier: &S)
/// -> (i32, i32)
/// {
/// (supplier.get(), supplier.get())
/// }
///
/// let s = BoxSupplier::new(|| 42);
/// assert_eq!(call_twice(&s), (42, 42));
///
/// let closure = || 100;
/// assert_eq!(call_twice(&closure), (100, 100));
/// ```
///
/// ## Stateless Factory
///
/// ```rust
/// use qubit_function::Supplier;
///
/// struct User {
/// name: String,
/// }
///
/// impl User {
/// fn new() -> Self {
/// User {
/// name: String::from("Default"),
/// }
/// }
/// }
///
/// let factory = || User::new();
/// let user1 = factory.get();
/// let user2 = factory.get();
/// // Each call creates a new User instance
/// ```