# Ergonomy ideas - Implemented: - `Default` for infallible convenience construction. - `fill_bytes(&mut [u8])` convenience so callers don't need to import `io::Read`. - `gen_range_` for all primitive integer widths. - `gen_range__in` for standard `RangeBounds` forms, including `Range` and `RangeInclusive`. - `choose(&[T]) -> &T` for generic slice selection. - `Clone` plus fallible `try_clone()` so multiple call sites can own separate handles without adding interior mutability. - Presets for direct alphabet names: `OsRandom::token(len)`, `::hex(len)`, and `::pin(len)`. - Deferred to keep the crate small: - `thread_local` global helpers like `ez_urandom::random_u64()` without constructing or threading an `OsRandom`. - `shuffle(&mut [T])`; `choose` covers the smaller selection use case without growing into collection algorithms. - `OsRandom::password(len)`; password generation needs policy decisions about symbols, ambiguous characters, and service-specific constraints. - Still open for later consideration: - `bool()` / `f64()` (unit interval) helpers. - Accept a `&str` alphabet directly (not just `&[u8]`) and drop the ASCII assert by iterating `chars()`.