use std::cell::RefCell;
use std::rc::Rc;
use std::sync::Arc;
use parking_lot::Mutex;
use crate::consumers::{
bi_consumer_once::BoxBiConsumerOnce,
macros::{
impl_box_conditional_consumer,
impl_box_consumer_methods,
impl_conditional_consumer_clone,
impl_conditional_consumer_conversions,
impl_conditional_consumer_debug_display,
impl_consumer_clone,
impl_consumer_common_methods,
impl_consumer_debug_display,
impl_shared_conditional_consumer,
impl_shared_consumer_methods,
},
};
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_stateful_bi_consumer;
pub use box_stateful_bi_consumer::BoxStatefulBiConsumer;
mod rc_stateful_bi_consumer;
pub use rc_stateful_bi_consumer::RcStatefulBiConsumer;
mod arc_stateful_bi_consumer;
pub use arc_stateful_bi_consumer::ArcStatefulBiConsumer;
mod fn_stateful_bi_consumer_ops;
pub use fn_stateful_bi_consumer_ops::FnStatefulBiConsumerOps;
mod box_conditional_stateful_bi_consumer;
pub use box_conditional_stateful_bi_consumer::BoxConditionalStatefulBiConsumer;
mod arc_conditional_stateful_bi_consumer;
pub use arc_conditional_stateful_bi_consumer::ArcConditionalStatefulBiConsumer;
mod rc_conditional_stateful_bi_consumer;
pub use rc_conditional_stateful_bi_consumer::RcConditionalStatefulBiConsumer;
pub trait StatefulBiConsumer<T, U> {
fn accept(&mut self, first: &T, second: &U);
fn into_box(self) -> BoxStatefulBiConsumer<T, U>
where
Self: Sized + 'static,
{
let mut consumer = self;
BoxStatefulBiConsumer::new(move |t, u| consumer.accept(t, u))
}
fn into_rc(self) -> RcStatefulBiConsumer<T, U>
where
Self: Sized + 'static,
{
let mut consumer = self;
RcStatefulBiConsumer::new(move |t, u| consumer.accept(t, u))
}
fn into_arc(self) -> ArcStatefulBiConsumer<T, U>
where
Self: Sized + Send + 'static,
{
let mut consumer = self;
ArcStatefulBiConsumer::new(move |t, u| consumer.accept(t, u))
}
fn into_fn(self) -> impl FnMut(&T, &U)
where
Self: Sized + 'static,
{
let mut consumer = self;
move |t, u| consumer.accept(t, u)
}
fn into_once(self) -> BoxBiConsumerOnce<T, U>
where
Self: Sized + 'static,
{
BoxBiConsumerOnce::new(move |t, u| {
let mut consumer = self;
consumer.accept(t, u);
})
}
fn to_box(&self) -> BoxStatefulBiConsumer<T, U>
where
Self: Sized + Clone + 'static,
{
self.clone().into_box()
}
fn to_rc(&self) -> RcStatefulBiConsumer<T, U>
where
Self: Sized + Clone + 'static,
{
self.clone().into_rc()
}
fn to_arc(&self) -> ArcStatefulBiConsumer<T, U>
where
Self: Sized + Clone + Send + 'static,
{
self.clone().into_arc()
}
fn to_fn(&self) -> impl FnMut(&T, &U)
where
Self: Sized + Clone + 'static,
{
self.clone().into_fn()
}
fn to_once(&self) -> BoxBiConsumerOnce<T, U>
where
Self: Clone + 'static,
{
self.clone().into_once()
}
}