You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
1.9 KiB
99 lines
1.9 KiB
//! Extensions
|
|
|
|
pub trait JoinStrsExt: Sized
|
|
{
|
|
/// Join an iterator of `str` with a seperator
|
|
fn join(self, with: &str) -> String;
|
|
}
|
|
|
|
impl<T,I> JoinStrsExt for I
|
|
where I: Iterator<Item=T>,
|
|
T: AsRef<str>
|
|
{
|
|
fn join(self, with: &str) -> String
|
|
{
|
|
let mut output = String::new();
|
|
let mut first=true;
|
|
for string in self
|
|
{
|
|
if !first {
|
|
output.push_str(with);
|
|
}
|
|
let string = string.as_ref();
|
|
output.push_str(string);
|
|
first=false;
|
|
}
|
|
output
|
|
}
|
|
}
|
|
|
|
/*macro_rules! typed_swap {
|
|
(@ [] $($reversed:tt)*) => {
|
|
fn swap(self) -> ($($reversed)*);
|
|
};
|
|
(@ [$first:tt $($rest:tt)*] $($reversed:tt)*) => {
|
|
typed_swap!{@ [$($rest)*] $first $($reversed)*}
|
|
};
|
|
(@impl {$($body:tt)*} [] $($reversed:tt)*) => {
|
|
fn swap(self) -> ($($reversed)*)
|
|
{
|
|
$($body)*
|
|
}
|
|
};
|
|
(@impl {$($body:tt)*} [$first:tt $($rest:tt)*] $($reversed:tt)*) => {
|
|
typed_swap!{@impl {$($body)*} [$($rest)*] $first $($reversed)*}
|
|
};
|
|
() => {};
|
|
({$($params:tt)*} $($rest:tt)*) => {
|
|
mod swap {
|
|
pub trait SwapTupleExt<$($params)*>: Sized
|
|
{
|
|
typed_swap!(@ [$($params)*]);
|
|
}
|
|
|
|
impl<$($params)*> SwapTupleExt<$($params)*> for ($($params)*)
|
|
{
|
|
typed_swap!(@impl {
|
|
todo!()
|
|
} [$($params)*]);
|
|
}
|
|
|
|
typed_swap!($($rest)*);
|
|
}
|
|
pub use swap::*;
|
|
};
|
|
|
|
(all $first:tt $($params:tt)+) => {
|
|
typed_swap!({$first, $($params),+});
|
|
mod nswap {
|
|
typed_swap!(all $($params)+);
|
|
}
|
|
};
|
|
(all $($one:tt)?) => {};
|
|
}
|
|
|
|
typed_swap!(all A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
|
|
pub use swap::*;
|
|
|
|
fn test()
|
|
{
|
|
let sw = (1, 2).swap();
|
|
|
|
}*/
|
|
// ^ unfortunately not lol
|
|
|
|
pub trait SwapTupleExt<T,U>: Sized
|
|
{
|
|
fn swap(self) -> (U,T);
|
|
}
|
|
impl<T,U> SwapTupleExt<T,U> for (T,U)
|
|
{
|
|
#[inline(always)] fn swap(self) -> (U,T) {
|
|
(self.1, self.0)
|
|
}
|
|
}
|
|
|
|
/*typed_swap!({A, B}
|
|
{A, U, V}
|
|
{T, U, V, W});*/
|