Crates.io | variadic_monoids |
lib.rs | variadic_monoids |
version | 0.1.1 |
source | src |
created_at | 2020-08-06 21:15:23.699646 |
updated_at | 2020-08-06 21:19:43.920702 |
description | Construct variadic functions using monoids |
homepage | |
repository | https://github.com/richardlett/VariadicMonoids/ |
max_upload_size | |
id | 273755 |
size | 3,924 |
This small crate provides (experimental) support for creating variadic functions from monoids.
More simply, given a fn f(T,T) -> T
, this crate allows you to produce a variadic function f'
such that
f'(a: T,b: T, c: T,....) == f(a,f(b,f(c,...f(z,identity)..)))
Where Identity is an identity operation on f. (Specifically, only f(a, identity) == a
must actually hold).
How to Use:
use variadic_monoids::*;
// You must create a name for your monoid with a struct. This allows you to
// create multiple monoids per type (and they can be for external too)
struct AddMonoid;
impl Monoid<AddMonoid> for i32 {
fn identity() -> Self { 0 }
fn operator(a: Self, b: Self) -> Self { a + b }
}
// Call the (constant function) gen_function to retrieve your function
// With type parameters as the implemented Type, and Name of your monoid.
const sum: VariFunc<i32, AddMonoid> = gen_function::<i32, AddMonoid>();
fn main() {
println!("{}", sum(1,2,3,4));
}
In your Cargo.toml
[dependencies]
...
variadic_monoids="0.1.1"