#binding #argument #parameters #bind

no-std partial_application

partial function application via the partial! macro

3 unstable releases

Uses old Rust 2015

0.2.1 Jul 30, 2020
0.2.0 Sep 23, 2019
0.1.0 Feb 26, 2018

#759 in Rust patterns

Download history 104/week @ 2024-01-04 136/week @ 2024-01-11 185/week @ 2024-01-18 92/week @ 2024-01-25 80/week @ 2024-02-01 250/week @ 2024-02-08 207/week @ 2024-02-15 277/week @ 2024-02-22 321/week @ 2024-02-29 303/week @ 2024-03-07 230/week @ 2024-03-14 303/week @ 2024-03-21 315/week @ 2024-03-28 268/week @ 2024-04-04 343/week @ 2024-04-11 180/week @ 2024-04-18

1,158 downloads per month
Used in 12 crates (9 directly)

MIT/Apache

11KB
122 lines

partial_application

The partial! macro allows for partial application of a function.

partial!(some_fn => arg0, _, arg2, _) returns the closure |x1, x3| some_fn(arg0, x1, arg2, x3).
Move closures are created by adding move in front of the function: partial!(move ..)

use partial_application::partial;

// When you're using the 2015 edition of Rust, you need to import the macro like this
#[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, 42, 10, 10);
    assert_eq!(
        foo(15, 15, 10, 42, 10, 10),
        bar(15, 15)
    );
}

lib.rs:

The partial! macro allows for partial application of a function.

partial!(some_fn => arg0, _, arg2, _) returns the closure |x1, x3| some_fn(arg0, x1, arg2, x3).
Move closures are created by adding move in front of the function: partial!(move ..)

#[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)
    );
}

The expressions used to fix an argument are reevaluated on every call of the new function because of the straightforward translation behind the macro.

#
fn identity(x: u32) -> u32 { x }

let mut n = 0;
let mut f = partial!(identity => { n += 1; n});
assert_eq!(f(), 1);
assert_eq!(f(), 2);

Pre-compute arguments to be fixed in a local variable, if their creation is expensive or has unwanted side-effects.

You can also use a comma (,) or semicolon (;) instead of the arrow (=>). This strange syntax choice is due to limitations imposed on us by the macro system. No other tokens may follow the expression token for the function.

No runtime deps