effect-rs 0.1.0

A high-performance, strictly-typed, functional effect system for Rust.
Documentation
use effect_rs::{Effect, Env, EnvRef, Exit, Layer, Runtime};
// use std::sync::Arc;

#[derive(Clone)]
struct Database {
    url: String,
}

#[derive(Clone)]
#[allow(dead_code)]
struct Config {
    port: i32,
}

#[test]
fn test_layer_provide() {
    let rt = Runtime::new();

    // Layer that provides Database (needs nothing -> In=())
    // We specify the generics for the impl block explicitly to help inference
    let db_layer: Layer<(), (), Database> = Layer::<(), (), ()>::succeed(Database {
        url: "postgres://".to_string(),
    });

    // Effect that needs Database
    let program = Effect::access_async(|env: EnvRef<Env>, _| {
        let db = env.value.get::<Database>().unwrap();
        let url = db.url.clone();
        async move { url }
    });

    // Provide layer
    let provided = db_layer.provide_to(program);

    let result = rt.block_on(provided, ());

    match result {
        Exit::Success(val) => assert_eq!(val, "postgres://"),
        Exit::Failure(_) => panic!("Expected success"),
    }
}