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

#473 in Rust patterns

Download history 134/week @ 2025-01-15 1390/week @ 2025-01-22 311/week @ 2025-01-29 317/week @ 2025-02-05 440/week @ 2025-02-12 229/week @ 2025-02-19 282/week @ 2025-02-26

1,382 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