pub use crate::as_ref::Join;
pub mod display {
pub trait Join {
fn write_join<I: Display, W: Write, T: IntoIterator<Item=I>>(&self, writer: W, coll: T) -> io::Result<usize>;
fn join<I: Display, T: IntoIterator<Item=I>>(&self, coll: T) -> String {
let mut s = Vec::new();
self.write_join(&mut s, coll).expect("This shouldn't fail");
String::from_utf8(s).unwrap()
}
}
impl<A: AsRef<str>> Join for A {
fn write_join<I: Display, W: Write, T: IntoIterator<Item=I>>(&self, mut writer: W, coll: T) -> io::Result<usize> {
let mut iter = coll.into_iter();
let mut written = 0;
if let Some(first) = iter.next() {
let first = first.to_string();
let bytes = first.as_bytes();
writer.write_all(bytes)?;
written += bytes.len();
}
for s in iter {
let t1 = self.as_ref().as_bytes();
writer.write_all(t1)?;
written += t1.len();
let s = s.to_string();
let t2 = s.as_bytes();
writer.write_all(t2)?;
written += t2.len();
}
writer.flush()?;
io::Result::Ok(written)
}
}
#[cfg(test)]
mod tests {
#[test]
fn write_join_to_file() {
let v = vec![];
let mut cur = Cursor::new(v);
let written = "=".write_join(&mut cur, &['a', 'b', 'c']).expect("Couldn't write joined string");
let result = cur.into_inner();
assert_eq!(written, 5);
assert_eq!(&result[..], "a=b=c".as_bytes());
}
#[test]
fn join_with_heap_string() {
let equal = String::from("=");
let result = equal.join(&['a', 'b', 'c']);
assert_eq!("a=b=c", &result[..]);
}
#[test]
fn join_with_borrowed_string() {
let equal = String::from("=");
let eq = &equal[..];
let result = eq.join(&['a', 'b', 'c']);
assert_eq!("a=b=c", &result[..]);
}
#[test]
fn join_with_cow_string() {
let equal = String::from("=");
let eq: Cow<'_, str> = Cow::Borrowed(&equal[..]);
let result = eq.join(&['a', 'b', 'c']);
assert_eq!("a=b=c", &result[..]);
}
#[test]
fn join_hashset() {
let set = {
let mut set = HashSet::new();
set.insert('a');
set.insert('b');
set.insert('c');
set
};
let result = "=".join(&set);
assert!(vec!["a=b=c", "a=c=b", "b=a=c", "b=c=a", "c=a=b", "c=b=a"].contains(&&result[..]));
}
use std::io::Cursor;
use std::borrow::Cow;
use std::collections::HashSet;
use super::Join;
}
use std::{
fmt::Display,
io::{self, Write},
};
}
pub mod as_ref {
pub trait Join {
fn write_join<I: AsRef<str>, W: Write, T: IntoIterator<Item=I>>(&self, writer: W, coll: T) -> io::Result<usize>;
fn join<I: AsRef<str>, T: IntoIterator<Item=I>>(&self, coll: T) -> String {
let mut s = Vec::new();
self.write_join(&mut s, coll).expect("This shouldn't fail");
String::from_utf8(s).unwrap()
}
}
impl<A: AsRef<str>> Join for A {
fn write_join<I: AsRef<str>, W: Write, T: IntoIterator<Item=I>>(&self, mut writer: W, coll: T) -> io::Result<usize> {
let mut iter = coll.into_iter();
let mut written = 0;
if let Some(first) = iter.next() {
let bytes = first.as_ref().as_bytes();
writer.write_all(bytes)?;
written += bytes.len();
}
for s in iter {
let t1 = self.as_ref().as_bytes();
writer.write_all(t1)?;
written += t1.len();
let t2 = s.as_ref().as_bytes();
writer.write_all(t2)?;
written += t2.len();
}
writer.flush()?;
io::Result::Ok(written)
}
}
#[cfg(test)]
mod tests {
#[test]
fn write_join_to_file() {
let v = vec![];
let mut cur = Cursor::new(v);
let written = "=".write_join(&mut cur, &["a", "b", "c"]).expect("Couldn't write joined string");
let result = cur.into_inner();
assert_eq!(written, 5);
assert_eq!(&result[..], "a=b=c".as_bytes());
}
#[test]
fn join_with_heap_string() {
let equal = String::from("=");
let result = equal.join(&["a", "b", "c"]);
assert_eq!("a=b=c", &result[..]);
}
#[test]
fn join_with_borrowed_string() {
let equal = String::from("=");
let eq = &equal[..];
let result = eq.join(&["a", "b", "c"]);
assert_eq!("a=b=c", &result[..]);
}
#[test]
fn join_with_cow_string() {
let equal = String::from("=");
let eq: Cow<'_, str> = Cow::Borrowed(&equal[..]);
let result = eq.join(&["a", "b", "c"]);
assert_eq!("a=b=c", &result[..]);
}
#[test]
fn join_hashset() {
let set = {
let mut set = HashSet::new();
set.insert("a");
set.insert("b");
set.insert("c");
set
};
let result = "=".join(&set);
assert!(vec!["a=b=c", "a=c=b", "b=a=c", "b=c=a", "c=a=b", "c=b=a"].contains(&&result[..]));
}
use std::io::Cursor;
use std::borrow::Cow;
use std::collections::HashSet;
use super::Join;
}
use std::{
io::{self, Write},
};
}