use std::rc::Rc;
use std::sync::Arc;
use crate::functions::{
bi_mutating_function_once::BoxBiMutatingFunctionOnce,
macros::{
impl_box_conditional_function,
impl_box_function_methods,
impl_conditional_function_clone,
impl_conditional_function_debug_display,
impl_function_clone,
impl_function_common_methods,
impl_function_constant_method,
impl_function_debug_display,
impl_shared_conditional_function,
impl_shared_function_methods,
},
mutating_function::MutatingFunction,
};
use crate::macros::{
impl_arc_conversions,
impl_box_conversions,
impl_closure_trait,
impl_rc_conversions,
};
use crate::predicates::bi_predicate::{
ArcBiPredicate,
BiPredicate,
BoxBiPredicate,
RcBiPredicate,
};
mod box_bi_mutating_function;
pub use box_bi_mutating_function::BoxBiMutatingFunction;
mod rc_bi_mutating_function;
pub use rc_bi_mutating_function::RcBiMutatingFunction;
mod arc_bi_mutating_function;
pub use arc_bi_mutating_function::ArcBiMutatingFunction;
mod fn_bi_mutating_function_ops;
pub use fn_bi_mutating_function_ops::FnBiMutatingFunctionOps;
mod box_binary_mutating_function;
pub use box_binary_mutating_function::BoxBinaryMutatingFunction;
mod arc_binary_mutating_function;
pub use arc_binary_mutating_function::ArcBinaryMutatingFunction;
mod rc_binary_mutating_function;
pub use rc_binary_mutating_function::RcBinaryMutatingFunction;
mod box_conditional_bi_mutating_function;
pub use box_conditional_bi_mutating_function::BoxConditionalBiMutatingFunction;
mod rc_conditional_bi_mutating_function;
pub use rc_conditional_bi_mutating_function::RcConditionalBiMutatingFunction;
mod arc_conditional_bi_mutating_function;
pub use arc_conditional_bi_mutating_function::ArcConditionalBiMutatingFunction;
pub trait BiMutatingFunction<T, U, R> {
fn apply(&self, first: &mut T, second: &mut U) -> R;
fn into_box(self) -> BoxBiMutatingFunction<T, U, R>
where
Self: Sized + 'static,
{
BoxBiMutatingFunction::new(move |t, u| self.apply(t, u))
}
fn into_rc(self) -> RcBiMutatingFunction<T, U, R>
where
Self: Sized + 'static,
{
RcBiMutatingFunction::new(move |t, u| self.apply(t, u))
}
fn into_arc(self) -> ArcBiMutatingFunction<T, U, R>
where
Self: Sized + Send + Sync + 'static,
{
ArcBiMutatingFunction::new(move |t, u| self.apply(t, u))
}
fn into_fn(self) -> impl Fn(&mut T, &mut U) -> R
where
Self: Sized + 'static,
{
move |t, u| self.apply(t, u)
}
fn into_once(self) -> BoxBiMutatingFunctionOnce<T, U, R>
where
Self: Sized + 'static,
{
BoxBiMutatingFunctionOnce::new(move |t, u| self.apply(t, u))
}
fn to_box(&self) -> BoxBiMutatingFunction<T, U, R>
where
Self: Sized + Clone + 'static,
{
self.clone().into_box()
}
fn to_rc(&self) -> RcBiMutatingFunction<T, U, R>
where
Self: Sized + Clone + 'static,
{
self.clone().into_rc()
}
fn to_arc(&self) -> ArcBiMutatingFunction<T, U, R>
where
Self: Sized + Clone + Send + Sync + 'static,
{
self.clone().into_arc()
}
fn to_fn(&self) -> impl Fn(&mut T, &mut U) -> R
where
Self: Sized + Clone + 'static,
{
self.clone().into_fn()
}
fn to_once(&self) -> BoxBiMutatingFunctionOnce<T, U, R>
where
Self: Clone + 'static,
{
self.clone().into_once()
}
}