I have developed a collection of utility and convenience Rust modules that are useful to me, and may be useful to you also.
This crate is a collection of largely-independent small modules. I do not currently offer features to disable modules independently of each other, but their compilation cost is small enough to essentially not matter.
This provides an extension trait for DoubleEndedIterator
with a method,
.bidi(cond: bool)
, that sets whether the iterator operates in forward or
reverse by the runtime condition. When the condition is true
, forward
iteration (with .next()
, .nth()
) forwards to the equivalent reverse
methods (.next_back()
, .nth_back()
) and vice-versa; when the condition is
false
, iteration behaves normally.
This only checks the condition upon initial creation; it is otherwise branchless.
This is a macro that calls std::process::exit
. It can return a status code,
and also print a message to stderr
.
use wyz::exit::exit;
exit!();
exit!(2);
exit!(3, "This is a {} message", "failure");
The default call is std::process::exit(1)
; a call may provide its own exit
code and, in addition, a set of arguments to pass directly to eprintln!
. The
error message is not guaranteed to be emitted, as stderr
may be closed at time
of exit!
.
Rust uses the Debug
trait for automatic printing events in several parts of
the standard library. This module provides wrapper types which forward their
Debug
implementation to a specified other formatting trait. It also implements
extension methods on all types that have format trait implementations to wrap
them in the corresponding shim type.
use wyz::fmt::FmtForward as _;
let val = 6;
let addr = &val as *const i32;
println!("{:?}", addr.fmt_pointer());
This snippet uses the Debug
format template, but will print the Pointer
implementation of *const i32
.
This is useful for fitting your values into an error-handling framework that
only uses Debug
, such as the fn main() -> Result
program layout.
In addition to forwarding each of the scalar traits, this also provides a
.fmt_list()
that formats any type T where &T: IntoIterator
as a list. The
list-formatting adapter itself implements all of the scalar formatting traits,
and can also be wrapped in any of the forwarding guards so that it can be sent
to a Debug
sink:
use wyz::fmt::FmtForward as _;
let seq = 0 .. 4;
assert_eq!(
format!("{:02b}", seq.fmt_list()),
"[00, 01, 10, 11]",
);
assert_eq!(
format!(
"{:?}",
seq
.map(|x| (x + 1) * 10)
.fmt_list()
.fmt_lower_hex(),
),
"[a, 14, 1e, 28]",
);
This provides an extension trait, RangeExt
, on RangeBounds
. It is currently
only used with R: RangeBounds<usize>
, again because it is an MVP for bitvec’s
use rather than a project in its own right. It normalizes arbitrary ranges into
the Range
concrete type. PRs welcome!