layer-rs 0.1.1

Effect-TS like type level DI container in Rust, with O(log n) get and insert
Documentation
use super::*;
use crate::prelude::*;

#[test]
fn test_get() {
    let node: Node<u32, Node<i32, Node<bool, (), ()>, ()>, Node<f32, (), ()>> = Node {
        requirement: 10u32,
        prev_left: Node {
            requirement: -5i32,
            prev_left: Node {
                requirement: true,
                prev_left: (),
                prev_right: (),
            },
            prev_right: (),
        },
        prev_right: Node {
            requirement: 3.14f32,
            prev_left: (),
            prev_right: (),
        },
    };
    let layer = Layer::dangerously_new_from_node(node);
    assert_eq!(*layer.get::<u32, _>(), 10u32);
    assert_eq!(*layer.get::<i32, _>(), -5i32);
    assert_eq!(*layer.get::<bool, _>(), true);
    assert_eq!(*layer.get::<f32, _>(), 3.14f32);
}

#[test]
fn test_insert() {
    let layer = Layer::new(10u32);
    let layer = layer.insert(-5i32);
    let layer = layer.insert(3.14f32);
    let layer = layer.insert(true);
    let layer = layer.insert(Some(10u32));
    let layer = layer.insert(Some(-5i32));
    let layer = layer.insert(Some(3.14f32));
    let layer = layer.insert(Some(true));
    assert_eq!(*layer.get::<u32, _>(), 10u32);
    assert_eq!(*layer.get::<i32, _>(), -5i32);
    assert_eq!(*layer.get::<f32, _>(), 3.14f32);
    assert_eq!(*layer.get::<bool, _>(), true);
    assert_eq!(*layer.get::<Option<u32>, _>(), Some(10u32));
    assert_eq!(*layer.get::<Option<i32>, _>(), Some(-5i32));
    assert_eq!(*layer.get::<Option<f32>, _>(), Some(3.14f32));
    assert_eq!(*layer.get::<Option<bool>, _>(), Some(true));
}