#dynamically-typed #function #value #arguments #reference #mutable #represents

any-fn

Dynamically-typed functions to represent any functions in Rust

14 releases (5 breaking)

new 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

#844 in Rust patterns

Download history 67/week @ 2025-01-14 1276/week @ 2025-01-21

1,343 downloads per month
Used in 2 crates (via stak-native)

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