pub trait CallMut<Params>: CallInto<Params> {
    fn mut_call_(&mut self, params: Params) -> Self::Returns;
}
Available on crate feature callable only.
Expand description

Implementable alternative to std::ops::FnMut.

Parameters

The Call* traits encode multiple parameters like this:

  • 0 parameters: by taking a () parameter, eg: foo.ref_call(()).

  • 1 parameters: by taking the single parameter, eg: foo.ref_call(10).

  • 2 or more parameters: by taking a tuple of the parameters, eg: foo.ref_call((10, 20)).

Example

use core_extensions::{impl_call, CallExt};

struct Reporter{
    line: u32,
}

impl_call! { 
    fn mut_call(self: Reporter, buffer: &mut String, person: &str, score: u32) {
        use std::fmt::Write;

        writeln!(buffer, "{}- {}: {}", self.line, person, score).unwrap();
         
        self.line += 1;
    }
}

let mut reporter = Reporter{line: 0};
 
let mut buffer = String::new();

reporter.mut_call((&mut buffer, "foo", 10));
reporter.mut_call((&mut buffer, "bar", 7));
reporter.mut_call((&mut buffer, "baz", 1000));

assert_eq!(
    buffer,
    "\
        0- foo: 10\n\
        1- bar: 7\n\
        2- baz: 1000\n\
    "
);

Closure impls

Closures implement the Call* traits, and they always require a tuple of the parameters to be passed in.

use core_extensions::CallExt;

let mut i = 0;

let mut fn_0 = ||{i += 1; i};
assert_eq!(fn_0.mut_call(()), 1);

let mut fn_1 = |a: i32|{i += 1; a + i};
assert_eq!(fn_1.mut_call((5,)), 7);

let mut fn_2 = |a: i32, b: i32|{i += 1; a + b + i};
assert_eq!(fn_2.mut_call((8, 13)), 24);

Required Methods

calls this function

Implementors