14 releases (5 breaking)

0.6.1 Jan 26, 2025
0.6.0 Jan 24, 2025
0.5.2 Jan 24, 2025
0.4.1 Jan 21, 2025
0.1.3 Jan 20, 2025

#460 in Rust patterns

Download history 35/week @ 2025-01-14 1196/week @ 2025-01-21 490/week @ 2025-01-28 431/week @ 2025-02-04 437/week @ 2025-02-11

2,589 downloads per month
Used in 3 crates

Custom license

14KB
341 lines

any-fn

GitHub Action Crate License

Dynamically-typed functions via core::any::Any in Rust.

Due to combinatorial explosion, the dynamically-typed functions support only up to 6 arguments... 🥲

Examples

Mutating a struct

use any_fn::{r#fn, value};

struct Foo {
    foo: usize,
}

fn foo(x: usize, y: &mut Foo) {
    y.foo = x;
}

let x = value(Foo { foo: 0 });

r#fn(foo).call(&[&value(42usize), &x]).unwrap();

assert_eq!(x.downcast_ref::<Foo>().unwrap().foo, 42);

Calling a function with unboxed, immutable reference, and mutable reference arguments

use any_fn::{r#fn, Ref, value};

fn foo(x: usize, y: &usize, z: &mut usize) {
    *z = x + *y;
}

let x = value(0usize);

r#fn::<(_, Ref<_>, _), _>(foo)
    .call(&[&value(40usize), &value(2usize), &x])
    .unwrap();

assert_eq!(x.downcast::<usize>().unwrap(), 42);

License

MIT

No runtime deps