Skip to main content

adze_concurrency_caps_core/
lib.rs

1//! Compatibility façade for concurrency cap primitives and contracts.
2//!
3//! # Examples
4//!
5//! ```
6//! use adze_concurrency_caps_core::{ConcurrencyCaps, parse_positive_usize_or_default};
7//!
8//! // Build caps from a custom lookup (no env mutation)
9//! let caps = ConcurrencyCaps::from_lookup(|_| None);
10//! assert_eq!(caps.rayon_threads, 4);   // default
11//! assert_eq!(caps.tokio_worker_threads, 2); // default
12//!
13//! // Parse helper returns default for invalid input
14//! assert_eq!(parse_positive_usize_or_default(Some("0"), 8), 8);
15//! assert_eq!(parse_positive_usize_or_default(Some("16"), 8), 16);
16//! ```
17
18#![forbid(unsafe_op_in_unsafe_fn)]
19#![deny(missing_docs)]
20#![cfg_attr(feature = "strict_api", deny(unreachable_pub))]
21#![cfg_attr(not(feature = "strict_api"), warn(unreachable_pub))]
22#![cfg_attr(feature = "strict_docs", deny(missing_docs))]
23#![cfg_attr(not(feature = "strict_docs"), allow(missing_docs))]
24
25/// Environment-based concurrency cap configuration and defaults.
26pub use adze_concurrency_env_core::{
27    ConcurrencyCaps, DEFAULT_RAYON_NUM_THREADS, DEFAULT_TOKIO_WORKER_THREADS,
28    RAYON_NUM_THREADS_ENV, TOKIO_WORKER_THREADS_ENV, current_caps, parse_positive_usize_or_default,
29};
30/// One-time concurrency initialization helpers (rayon global pool, caps bootstrap).
31pub use adze_concurrency_init_core::{
32    init_concurrency_caps, init_rayon_global_once, is_already_initialized_error,
33};
34/// Bounded parallel map and partition planning utilities.
35pub use adze_concurrency_map_core::{
36    ParallelPartitionPlan, bounded_parallel_map, normalized_concurrency,
37};
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn caps_defaults_via_facade() {
45        let caps = ConcurrencyCaps::from_lookup(|_| None);
46        assert_eq!(caps.rayon_threads, DEFAULT_RAYON_NUM_THREADS);
47        assert_eq!(caps.tokio_worker_threads, DEFAULT_TOKIO_WORKER_THREADS);
48    }
49
50    #[test]
51    fn parse_helper_via_facade() {
52        assert_eq!(parse_positive_usize_or_default(Some("10"), 1), 10);
53        assert_eq!(parse_positive_usize_or_default(Some("0"), 5), 5);
54        assert_eq!(parse_positive_usize_or_default(None, 3), 3);
55    }
56
57    #[test]
58    fn bounded_map_via_facade() {
59        let mut result = bounded_parallel_map(vec![1, 2, 3], 2, |x| x * 10);
60        result.sort();
61        assert_eq!(result, vec![10, 20, 30]);
62    }
63
64    #[test]
65    fn normalized_concurrency_via_facade() {
66        assert_eq!(normalized_concurrency(0), 1);
67        assert_eq!(normalized_concurrency(4), 4);
68    }
69
70    #[test]
71    fn partition_plan_via_facade() {
72        let plan = ParallelPartitionPlan::for_item_count(10, 3);
73        assert!(plan.chunk_size > 0);
74    }
75}