momo 0.2.2

A procedural macro to de-monomorphize generic methods
Documentation
use momo::momo;

#[momo]
fn check_generic<I: Into<usize>, S: AsRef<str>, M: AsMut<[usize]>>(i: I, s: S, mut m: M) -> usize {
    i.into() + s.as_ref().len() + m.as_mut()[0]
}

#[momo]
fn check_impl_trait(i: impl Into<usize>, s: impl AsRef<str>, mut m: impl AsMut<[usize]>) -> usize {
    i.into() + s.as_ref().len() + m.as_mut()[0]
}

fn main() {
    let i = 1u8;
    let s = "Hello, Rust!";
    let mut m = [3usize, 42];
    assert_eq!(check_generic(i, s, &mut m), 16);
    assert_eq!(check_impl_trait(i, s, &mut m), 16);

    let check = Check;
    assert_eq!(check.generic(i, s, &mut m), 16);
    assert_eq!(check.impl_trait(i, s, &mut m), 16);
}

pub struct Check;

impl Check {
    #[momo]
    pub fn generic<I: Into<usize>, S: AsRef<str>, M: AsMut<[usize]>>(
        &self,
        i: I,
        s: S,
        mut m: M,
    ) -> usize {
        i.into() + s.as_ref().len() + m.as_mut()[0]
    }

    #[momo]
    pub fn impl_trait(
        &self,
        i: impl Into<usize>,
        s: impl AsRef<str>,
        mut m: impl AsMut<[usize]>,
    ) -> usize {
        i.into() + s.as_ref().len() + m.as_mut()[0]
    }
}