Crate partial_application [] [src]

The partial! macro allows partial application of a function.

Invoking partial!(some_fn(arg0, _, arg2, _)) will return the closure |x1, x3| some_fn(arg0, x1, arg2, x3).
The function call parentheses inside the macro are optional. Move closures can be created by adding move in front of the function: partial!(move ..)

Due to the straightforward translation, expression arguments will be reevaluated on every call. Pre-compute values if you don't want this.
partial!(some_fn _, _, rand::thread_rng().gen::<u8>(), { println!("called again"); arg3 })
The closure created from the above will get a new random number and print "called again" on every call.

#[macro_use]
extern crate partial_application;

fn foo(a: i32, b: i32, c: i32, d: i32, mul: i32, off: i32) -> i32 {
    (a + b*b + c.pow(3) + d.pow(4)) * mul - off
}

fn main() {
    let bar = partial!( foo(_, _, 10, _, 10, 10) );
    assert_eq!(
        foo(15, 15, 10, 42, 10, 10),
        bar(15, 15,     42)
    );
}

Macros

partial

The macro that creates a wrapping closure for a partially applied function