use crate::types::TypedVariables;
use crate::types::{Preference, PreferenceGD};
use std::ops::Deref;
#[derive(Debug, Clone, PartialEq, Default)]
pub struct PreconditionGoalDefinitions(Vec<PreconditionGoalDefinition>);
impl PreconditionGoalDefinitions {
pub const fn new(values: Vec<PreconditionGoalDefinition>) -> Self {
Self(values)
}
pub fn new_preference(pref: PreferenceGD) -> Self {
PreconditionGoalDefinition::new_preference(pref).into()
}
pub fn new_forall(variables: TypedVariables, gd: PreconditionGoalDefinitions) -> Self {
PreconditionGoalDefinition::new_forall(variables, gd).into()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn iter(&self) -> std::slice::Iter<PreconditionGoalDefinition> {
self.0.iter()
}
pub fn try_get_single(self) -> Option<PreconditionGoalDefinition> {
if self.len() == 1 {
self.into_iter().next()
} else {
None
}
}
}
impl FromIterator<PreconditionGoalDefinition> for PreconditionGoalDefinitions {
fn from_iter<T: IntoIterator<Item = PreconditionGoalDefinition>>(iter: T) -> Self {
PreconditionGoalDefinitions::new(iter.into_iter().collect())
}
}
impl Deref for PreconditionGoalDefinitions {
type Target = [PreconditionGoalDefinition];
fn deref(&self) -> &Self::Target {
self.0.as_slice()
}
}
impl AsRef<[PreconditionGoalDefinition]> for PreconditionGoalDefinitions {
fn as_ref(&self) -> &[PreconditionGoalDefinition] {
self.0.as_slice()
}
}
impl IntoIterator for PreconditionGoalDefinitions {
type Item = PreconditionGoalDefinition;
type IntoIter = std::vec::IntoIter<PreconditionGoalDefinition>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl From<PreconditionGoalDefinition> for PreconditionGoalDefinitions {
fn from(value: PreconditionGoalDefinition) -> Self {
PreconditionGoalDefinitions::new(vec![value])
}
}
impl From<Option<PreconditionGoalDefinition>> for PreconditionGoalDefinitions {
fn from(value: Option<PreconditionGoalDefinition>) -> Self {
match value {
None => PreconditionGoalDefinitions::default(),
Some(value) => value.into(),
}
}
}
impl From<Option<PreconditionGoalDefinitions>> for PreconditionGoalDefinitions {
fn from(value: Option<PreconditionGoalDefinitions>) -> Self {
match value {
None => PreconditionGoalDefinitions::default(),
Some(values) => values,
}
}
}
impl From<PreconditionGoalDefinitions> for Vec<PreconditionGoalDefinition> {
fn from(value: PreconditionGoalDefinitions) -> Self {
value.0
}
}
impl TryInto<PreconditionGoalDefinition> for PreconditionGoalDefinitions {
type Error = ();
fn try_into(self) -> Result<PreconditionGoalDefinition, Self::Error> {
self.try_get_single().ok_or(())
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum PreconditionGoalDefinition {
Preference(PreferenceGD),
Forall(TypedVariables, PreconditionGoalDefinitions),
}
impl PreconditionGoalDefinition {
pub fn new_and<I: IntoIterator<Item = PreconditionGoalDefinition>>(
iter: I,
) -> PreconditionGoalDefinitions {
PreconditionGoalDefinitions::from_iter(iter)
}
pub const fn new_preference(pref: PreferenceGD) -> Self {
Self::Preference(pref)
}
pub const fn new_forall(variables: TypedVariables, gd: PreconditionGoalDefinitions) -> Self {
Self::Forall(variables, gd)
}
}
impl From<PreferenceGD> for PreconditionGoalDefinition {
fn from(value: PreferenceGD) -> Self {
PreconditionGoalDefinition::new_preference(value)
}
}
impl From<Preference> for PreconditionGoalDefinition {
fn from(value: Preference) -> Self {
PreconditionGoalDefinition::new_preference(PreferenceGD::from_preference(value))
}
}