use super::Effectus;
use core::marker::PhantomData;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct IoEffectus;
impl Effectus for IoEffectus {}
impl IoEffectus {
pub const fn new() -> Self {
IoEffectus
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct StatusEffectus<S> {
_phantom: PhantomData<S>,
}
impl<S: Send + Sync + 'static> Effectus for StatusEffectus<S> {}
impl<S> StatusEffectus<S> {
pub const fn new() -> Self {
StatusEffectus {
_phantom: PhantomData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct ErrorEffectus<E> {
_phantom: PhantomData<E>,
}
impl<E: Send + Sync + 'static> Effectus for ErrorEffectus<E> {}
impl<E> ErrorEffectus<E> {
pub const fn new() -> Self {
ErrorEffectus {
_phantom: PhantomData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct AsyncEffectus;
impl Effectus for AsyncEffectus {}
impl AsyncEffectus {
pub const fn new() -> Self {
AsyncEffectus
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct ReaderEffectus<R> {
_phantom: PhantomData<R>,
}
impl<R: Send + Sync + 'static> Effectus for ReaderEffectus<R> {}
impl<R> ReaderEffectus<R> {
pub const fn new() -> Self {
ReaderEffectus {
_phantom: PhantomData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct ScriptorEffectus<W> {
_phantom: PhantomData<W>,
}
impl<W: Send + Sync + 'static> Effectus for ScriptorEffectus<W> {}
impl<W> ScriptorEffectus<W> {
pub const fn new() -> Self {
ScriptorEffectus {
_phantom: PhantomData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct RandomEffectus;
impl Effectus for RandomEffectus {}
impl RandomEffectus {
pub const fn new() -> Self {
RandomEffectus
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct TempusEffectus;
impl Effectus for TempusEffectus {}
impl TempusEffectus {
pub const fn new() -> Self {
TempusEffectus
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct ResourceEffectus<R> {
_phantom: PhantomData<R>,
}
impl<R: Send + Sync + 'static> Effectus for ResourceEffectus<R> {}
impl<R> ResourceEffectus<R> {
pub const fn new() -> Self {
ResourceEffectus {
_phantom: PhantomData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct PurusEffectus;
impl Effectus for PurusEffectus {}
impl PurusEffectus {
pub const fn new() -> Self {
PurusEffectus
}
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::string::String;
use alloc::vec::Vec;
fn requires_effectus<E: Effectus>() {}
#[test]
fn test_io_effectus() {
requires_effectus::<IoEffectus>();
let _effect = IoEffectus::new();
}
#[test]
fn test_status_effectus() {
requires_effectus::<StatusEffectus<i32>>();
let _effect: StatusEffectus<String> = StatusEffectus::new();
}
#[test]
fn test_error_effectus() {
requires_effectus::<ErrorEffectus<String>>();
let _effect: ErrorEffectus<std::io::Error> = ErrorEffectus::new();
}
#[test]
fn test_async_effectus() {
requires_effectus::<AsyncEffectus>();
let _effect = AsyncEffectus::new();
}
#[test]
fn test_reader_effectus() {
requires_effectus::<ReaderEffectus<String>>();
let _effect: ReaderEffectus<i32> = ReaderEffectus::new();
}
#[test]
fn test_scriptor_effectus() {
requires_effectus::<ScriptorEffectus<Vec<String>>>();
let _effect: ScriptorEffectus<String> = ScriptorEffectus::new();
}
#[test]
fn test_random_effectus() {
requires_effectus::<RandomEffectus>();
let _effect = RandomEffectus::new();
}
#[test]
fn test_tempus_effectus() {
requires_effectus::<TempusEffectus>();
let _effect = TempusEffectus::new();
}
#[test]
fn test_resource_effectus() {
requires_effectus::<ResourceEffectus<String>>();
let _effect: ResourceEffectus<()> = ResourceEffectus::new();
}
#[test]
fn test_purus_effectus() {
requires_effectus::<PurusEffectus>();
let _effect = PurusEffectus::new();
}
}