use fp_macros::*;
fp_macros::generate_function_re_exports!("src/classes", {
"category::identity": category_identity,
"cloneable_fn::new": cloneable_fn_new,
"function::new": fn_new,
"pointer::new": pointer_new,
"ref_counted_pointer::cloneable_new": ref_counted_pointer_new,
"send_ref_counted_pointer::send_new": send_ref_counted_pointer_new,
"plus::empty": plus_empty,
"semigroupoid::compose": semigroupoid_compose,
"send_cloneable_fn::new": send_cloneable_fn_new,
});
pub use crate::types::{
lazy::{
arc_lazy_fix,
rc_lazy_fix,
},
optics::{
optics_as_index,
optics_compose,
optics_indexed_fold_map,
optics_indexed_over,
optics_indexed_preview,
optics_indexed_set,
optics_indexed_view,
optics_reindexed,
optics_un_index,
positions,
},
};
#[document_signature]
#[document_type_parameters(
"The input type of the inner function `g`.",
"The output type of `g` and the input type of `f`.",
"The output type of the outer function `f`."
)]
#[document_parameters(
"The outer function to apply second.",
"The inner function to apply first.",
"The argument to be passed to the composed function."
)]
pub fn compose<A, B, C>(
f: impl Fn(B) -> C,
g: impl Fn(A) -> B,
) -> impl Fn(A) -> C {
move |a| f(g(a))
}
#[document_signature]
#[document_type_parameters(
"The type of the value to return.",
"The type of the argument to ignore."
)]
#[document_parameters(
"The value to be returned by the constant function.",
"The argument to be ignored."
)]
pub fn constant<A: Clone, B>(
a: A,
_b: B,
) -> A {
a
}
#[document_signature]
#[document_type_parameters(
"The type of the first argument of the input function.",
"The type of the second argument of the input function.",
"The return type of the function."
)]
#[document_parameters(
"A binary function.",
"The second argument (which will be passed as the first to `f`).",
"The first argument (which will be passed as the second to `f`)."
)]
pub fn flip<A, B, C>(f: impl Fn(A, B) -> C) -> impl Fn(B, A) -> C {
move |b, a| f(a, b)
}
#[document_signature]
#[document_type_parameters("The type of the value.")]
#[document_parameters("A value.")]
pub fn identity<A>(a: A) -> A {
a
}
#[document_signature]
#[document_type_parameters(
"The type of the original arguments.",
"The type of the projected arguments.",
"The result type."
)]
#[document_parameters(
"The binary function to apply to the projected values.",
"The projection function applied to both arguments.",
"The first argument.",
"The second argument."
)]
#[document_returns("The result of applying `f` to the projected values.")]
#[document_examples]
pub fn on<A, B, C>(
f: impl Fn(B, B) -> C,
g: impl Fn(A) -> B,
x: A,
y: A,
) -> C {
f(g(x), g(y))
}