access 0.1.0

A crate that helps creating diverse accessors
Documentation
use crate::{Access, AccessMut};

pub struct MapAccess<A, F> {
    access: A,
    from: F,
}

impl<'a, A, F> MapAccess<A, F> {
    pub(crate) fn new(access: A, from: F) -> Self {
        Self { access, from }
    }
}

impl<T, B, A, F> Access for MapAccess<A, F>
where
    A: Access<Target = T>,
    F: Fn(T) -> B,
{
    type Target = B;

    fn get(&self) -> B {
        (self.from)(self.access.get())
    }
}

pub struct MapAccessMut<A, F, I> {
    access: A,
    from: F,
    into: I,
}

impl<'a, A, F, I> MapAccessMut<A, F, I> {
    pub(crate) fn new(access: A, from: F, into: I) -> Self {
        Self { access, from, into }
    }
}

impl<T, B, A, F, I> Access for MapAccessMut<A, F, I>
where
    A: Access<Target = T>,
    F: Fn(T) -> B,
{
    type Target = B;

    fn get(&self) -> B {
        (self.from)(self.access.get())
    }
}

impl<T, B, A, F, I> AccessMut for MapAccessMut<A, F, I>
where
    A: AccessMut<Target = T>,
    F: Fn(T) -> B,
    I: Fn(B) -> T,
{
    fn set(&mut self, value: B) {
        self.access.set((self.into)(value));
    }
}