use std::marker::PhantomData;

use crate::component::Component;
use crate::query::{TermWithoutField, TermsBuilder, TermsBuilderInterface};

pub struct With<ComponentT>
where
    ComponentT: Component,
{
    _pd: PhantomData<ComponentT>,
}

impl<ComponentT> TermWithoutField for With<ComponentT>
where
    ComponentT: Component,
{
    fn apply_to_terms_builder(terms_builder: &mut TermsBuilder<'_>)
    {
        terms_builder.with::<ComponentT>();
    }
}

pub struct Without<ComponentT>
where
    ComponentT: Component,
{
    _pd: PhantomData<ComponentT>,
}

impl<ComponentT> TermWithoutField for Without<ComponentT>
where
    ComponentT: Component,
{
    fn apply_to_terms_builder(terms_builder: &mut TermsBuilder<'_>)
    {
        terms_builder.without::<ComponentT>();
    }
}