use derive_deftly::define_derive_deftly;
pub(crate) mod str;
pub mod batching_split_before;
use std::iter::Peekable;
#[cfg(test)]
use std::fmt::Display;
define_derive_deftly! {
export AsMutSelf expect items:
impl<$tgens> ::std::convert::AsMut<Self> for $ttype where $twheres {
fn as_mut(&mut self) -> &mut Self {
self
}
}
}
#[cfg(test)]
macro_rules! assert_eq_or_diff {
{ $a:expr, $b:expr $(,)? } => {
assert_eq_or_diff!($a, $b, "")
};
{ $a:expr, $b:expr , $($message:tt)*} => {
$crate::util::assert_eq_or_diff(
&$a,
stringify!($a),
&$b,
stringify!($b),
&format_args!($($message)*),
)
};
}
#[doc(hidden)]
pub trait PeekableIterator: Iterator {
fn peek(&mut self) -> Option<&Self::Item>;
}
impl<I: Iterator> PeekableIterator for Peekable<I> {
fn peek(&mut self) -> Option<&Self::Item> {
self.peek()
}
}
impl<I: PeekableIterator> PeekableIterator for &mut I {
fn peek(&mut self) -> Option<&Self::Item> {
<I as PeekableIterator>::peek(*self)
}
}
pub(crate) mod private {
#[expect(dead_code, unreachable_pub)] pub trait Sealed {}
}
#[cfg(test)]
#[allow(unused)]
fn test_as_mut_compiles() {
use derive_deftly::Deftly;
#[derive(Deftly)]
#[derive_deftly(AsMutSelf)]
struct S<T: Clone>
where
Option<T>: Clone,
{
t: T,
}
let _: &mut S<()> = S { t: () }.as_mut();
}
#[cfg(test)]
pub(crate) fn regsub(update: &mut String, re: &str, repl: impl regex::Replacer) {
*update = regex::Regex::new(&format!("(?m){re}"))
.expect(re)
.replace_all(update, repl)
.to_string();
}
#[cfg(test)]
pub(crate) fn assert_eq_or_diff(
a: &str,
a_what: &str,
b: &str,
b_what: &str,
message: &dyn Display,
) {
use imara_diff::{Algorithm, BasicLineDiffPrinter, Diff, InternedInput, UnifiedDiffConfig};
if a == b {
return;
}
let input = InternedInput::new(a, b);
let mut diff = Diff::compute(Algorithm::Histogram, &input);
diff.postprocess_lines(&input);
panic!(
"===== document {a_what} =====
{a}
===== document {b_what} =====
{b}
===== diff ====
{}
===== documents differ: {a_what} != {b_what} =====
{message}
",
diff.unified_diff(
&BasicLineDiffPrinter(&input.interner),
UnifiedDiffConfig::default(),
&input,
),
);
}