use crate::rust::Var;
use crate::{CodeBuffer, Expression, WithName};
pub trait WithFnGenerics: Sized {
fn generics(&self) -> &[Var];
fn add_generic<V>(&mut self, generic: V)
where
V: Into<Var>;
#[must_use]
fn with_generic<V>(mut self, generic: V) -> Self
where
V: Into<Var>,
{
self.add_generic(generic);
self
}
fn write_generic_brackets(&self, b: &mut CodeBuffer) {
if let Some((first, rest)) = self.generics().split_first() {
b.push('<');
first.write_name(b);
for generic in rest {
b.write(", ");
generic.write_name(b);
}
b.push('>');
}
}
fn write_generic_where(&self, b: &mut CodeBuffer) {
if let Some((first, rest)) = self.generics().split_first() {
b.write(" where ");
first.write(b);
for generic in rest {
b.write(", ");
generic.write(b);
}
}
}
}