use crate::effect::writer::boxed::BoxedWriterEffect;
use crate::effect::writer::censor::Censor;
use crate::effect::writer::listen::Listen;
use crate::effect::writer::pass::Pass;
use crate::effect::writer::tap_tell::TapTell;
use crate::effect::writer::WriterEffect;
use crate::Monoid;
use crate::Semigroup;
pub trait WriterEffectExt: WriterEffect {
fn tap_tell<F, W2>(self, f: F) -> TapTell<Self, F>
where
Self: Sized,
Self::Output: Clone + Send,
Self::Writes: Semigroup,
F: FnOnce(&Self::Output) -> W2 + Send,
W2: Into<Self::Writes>,
{
TapTell { inner: self, f }
}
fn censor<F>(self, f: F) -> Censor<Self, F>
where
Self: Sized,
F: FnOnce(Self::Writes) -> Self::Writes + Send,
{
Censor { inner: self, f }
}
fn listen(self) -> Listen<Self>
where
Self: Sized,
Self::Writes: Clone,
{
Listen { inner: self }
}
fn pass<T, F>(self) -> Pass<Self>
where
Self: WriterEffect<Output = (T, F)> + Sized,
T: Send,
F: FnOnce(Self::Writes) -> Self::Writes + Send,
{
Pass { inner: self }
}
#[allow(async_fn_in_trait)]
async fn run_ignore_writes(self, env: &Self::Env) -> Result<Self::Output, Self::Error>
where
Self: Sized,
{
let (result, _writes) = WriterEffect::run_writer(self, env).await;
result
}
fn boxed_writer(self) -> BoxedWriterEffect<Self::Output, Self::Error, Self::Env, Self::Writes>
where
Self: Sized + Send + 'static,
Self::Output: Send + 'static,
Self::Error: Send + 'static,
Self::Env: Clone + Send + Sync + 'static,
Self::Writes: Monoid + Send + 'static,
{
BoxedWriterEffect::new(self)
}
}
impl<E: WriterEffect> WriterEffectExt for E {}