effect-rs 0.1.0

A high-performance, strictly-typed, functional effect system for Rust.
Documentation
use effect_rs::{Effect, Runtime};

use std::sync::{Arc, Mutex};
use tracing::Subscriber;
use tracing_subscriber::layer::Context;
use tracing_subscriber::prelude::*;
use tracing_subscriber::{Layer, Registry};

#[derive(Clone)]
struct MockLayer {
    spans: Arc<Mutex<Vec<String>>>,
}

impl<S: Subscriber> Layer<S> for MockLayer {
    fn on_new_span(
        &self,
        attrs: &tracing::span::Attributes<'_>,
        _id: &tracing::Id,
        _ctx: Context<'_, S>,
    ) {
        let name = attrs.metadata().name();
        self.spans.lock().unwrap().push(name.to_string());
    }
}

#[test]
fn test_trace_combinator() {
    let spans = Arc::new(Mutex::new(Vec::new()));
    let layer = MockLayer {
        spans: spans.clone(),
    };

    let subscriber = Registry::default().with(layer);

    tracing::subscriber::with_default(subscriber, || {
        let rt = Runtime::new();
        let program: Effect<(), (), &str> = Effect::succeed("test").trace("my_span");

        let _ = rt.block_on(program, ());
    });

    let collected = spans.lock().unwrap();
    // block_on instruments with "runtime_execution"
    // trace adds "effect"

    assert!(collected.contains(&"effect".to_string()));
    assert!(collected.contains(&"runtime_execution".to_string()));
}