use partial_application_rs::part_app; #[part_app(poly, Clone)] pub fn foo(bar: u32, baz: u64) -> i16 { (bar + baz as u32) as i16 } #[test] fn poly_clone() { let adder = foo(); let with_two = adder.bar(Box::new(|| 1)); let final1 = with_two.clone().baz(Box::new(|| 2)); assert_eq!(final1.call(), 3); let final2 = with_two.baz(Box::new(|| 3)); assert_eq!(final2.call(), 4); } #[part_app(poly)] fn adder(a: u32, b: u32, c: u32) -> u32 { a + b + c } #[test] fn poly() { let a = adder().c(Box::new(|| 5)); let b = a.a(Box::new(|| 1 + 2)); if true { let c = b.b(Box::new(|| 6)); assert_eq!(c.call(), 14); } else { assert_eq!(b.b(Box::new(|| 0)).call(), 8); } } #[part_app] fn concat_string<'a>(s1: &'a str, s2: &'a str) -> String { s1.to_string() + &s2 } #[test] fn hello_world() { let world = concat_string().s2(|| "World!"); let hello = world.s1(|| "Hello, "); assert_eq!(hello.call(), "Hello, World!"); } #[part_app] fn add(x: u32, y: u32) -> i64 { (x + y) as i64 } #[test] fn simple_fn() { let a = add(); let two = a.x(|| 2); let number = two.y(|| 40); assert_eq!(number.call(), 42); } #[part_app(value)] fn value_add(x: u32, y: u32) -> i64 { (x + y) as i64 } #[test] fn by_value() { let adder = value_add().x(3); assert_eq!(adder.y(3).call(), 6); } #[part_app(value, Clone)] fn clone_value_add(x: u32, y: u32) -> u32 { x + y } #[test] fn clone_value_test() { let adder = clone_value_add(); let with_one = adder.x(1); assert_eq!(with_one.clone().y(2).call(), 3); assert_eq!(with_one.y(3).call(), 4); }