splutter 0.1.0

A library to create/generate text efficiently.
Documentation
use crate::output::Output;

pub struct SeparatedBy<V, B> {
    values: V,
    by: B,
}

impl<V, B> SeparatedBy<V, B>
where
    Self: Output,
{
    pub fn new(values: V, by: B) -> Self {
        Self { values, by }
    }
}

impl<V1, V2, B> Output for SeparatedBy<(V1, V2), B>
where
    V1: Output,
    V2: Output,
    B: Output,
{
    fn output(self, output: &mut String) {
        self.values.0.output(output);
        self.by.output(output);
        self.values.1.output(output);
    }
}

impl<V1, V2, V3, B> Output for SeparatedBy<(V1, V2, V3), B>
where
    V1: Output,
    V2: Output,
    V3: Output,
    B: Copy,
    B: Output,
{
    fn output(self, output: &mut String) {
        self.values.0.output(output);
        self.by.output(output);
        self.values.1.output(output);
        self.by.output(output);
        self.values.2.output(output);
    }
}

impl<V1, V2, V3, V4, B> Output for SeparatedBy<(V1, V2, V3, V4), B>
where
    V1: Output,
    V2: Output,
    V3: Output,
    V4: Output,
    B: Copy,
    B: Output,
{
    fn output(self, output: &mut String) {
        self.values.0.output(output);
        self.by.output(output);
        self.values.1.output(output);
        self.by.output(output);
        self.values.2.output(output);
        self.by.output(output);
        self.values.3.output(output);
    }
}

pub trait Separated<B> {
    fn separated(self, by: B) -> impl Output;
}

impl<O1, O2, By> Separated<By> for (O1, O2)
where
    O1: Output,
    O2: Output,
    By: Copy,
    By: Output,
{
    fn separated(self, by: By) -> impl Output {
        (self.0, by, self.1)
    }
}

impl<O1, O2, O3, By> Separated<By> for (O1, O2, O3)
where
    O1: Output,
    O2: Output,
    O3: Output,
    By: Copy,
    By: Output,
{
    fn separated(self, by: By) -> impl Output {
        SeparatedBy::new(self, by)
    }
}

impl<O1, O2, O3, O4, By> Separated<By> for (O1, O2, O3, O4)
where
    O1: Output,
    O2: Output,
    O3: Output,
    O4: Output,
    By: Copy,
    By: Output,
{
    fn separated(self, by: By) -> impl Output {
        SeparatedBy::new(self, by)
    }
}