deterministic_rand 0.8.0

Hierarchical random number generators for concurrent simulations with switchable determinism.
Documentation
//! Dealing with non-determinism in STD.
//!
//! In the standard library, randomness can also be a factor; for instance, iterating over the keys of a hashmap or hashset is non-deterministic. To achieve deterministic enumeration, you can use the `deterministic_rand ::IfDeterminismIteratorExt` extension for iterators. By applying `if_determinism_then_sort` or `if_determinism_then_sort_by` before processing the keys, you can ensure a consistent order. The `if_determinism_then_sort_by` method acts as a no-op (no operation) when determinism is off, but it performs sorting when the determinism feature is on.

// Import the necessary modules from the standard library and the `deterministic_rand` crate.
use std ::collections ::HashMap;
use deterministic_rand ::IfDeterminismIteratorExt;

fn main() 
{
  // Create a HashMap with three key-value pairs.
  let map: HashMap< _, _ > = HashMap ::from_iter([(1, "first"), (2, "second"), (3, "third")]);

  // Convert the HashMap into an iterator, apply deterministic sorting to the keys,
  // and then map each (key, value) pair to just the value.
  let keys: Vec< _ > = map
  .into_iter()
  .if_determinism_then_sort_by(|(a, _), (b, _)| a.cmp(b))
  .map(|e| e.1)
  .collect();

  // If the 'determinism' feature is enabled, assert that the sorted keys match the expected order.
  // This is a conditional compilation check that ensures the code block is compiled and run only
  // if the 'determinism' feature is enabled.
  #[ cfg(feature = "determinism") ]
  assert_eq!(keys, vec!["first", "second", "third"]);
}