use crate::{
    query::view::{
        resource::Get,
        Null,
    },
    resource::contains,
};

pub trait Reshape<ReshapedViews, Indices> {
    fn reshape(self) -> ReshapedViews;
}

impl Reshape<Null, contains::Null> for Null {
    fn reshape(self) -> Null {
        Null
    }
}

impl<'a, Resource, Views, ReshapedViews, Index, Indices>
    Reshape<(&'a Resource, ReshapedViews), (Index, Indices)> for Views
where
    Views: Get<Resource, Index, View = &'a Resource>,
    Views::Remainder: Reshape<ReshapedViews, Indices>,
{
    fn reshape(self) -> (&'a Resource, ReshapedViews) {
        let (view, remainder) = self.get();
        (view, remainder.reshape())
    }
}

impl<'a, Resource, Views, ReshapedViews, Index, Indices>
    Reshape<(&'a mut Resource, ReshapedViews), (Index, Indices)> for Views
where
    Views: Get<Resource, Index, View = &'a mut Resource>,
    Views::Remainder: Reshape<ReshapedViews, Indices>,
{
    fn reshape(self) -> (&'a mut Resource, ReshapedViews) {
        let (view, remainder) = self.get();
        (view, remainder.reshape())
    }
}
