wyz
myrrlyn’s wyzyrdly library
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.
Modules
bidi
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.
exit
This is a macro that calls std::process::exit
. It can return a status code,
and also print a message to stderr
.
use exit;
exit!;
exit!;
exit!;
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!
.
fmt
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 FmtForward as _;
let val = 6;
let addr = &val as *const i32;
println!;
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 FmtForward as _;
let seq = 0 .. 4;
assert_eq!;
assert_eq!;
range
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!