use crate::Number;
use super::Term;
pub enum SequenceOperations
{
Addition,
Multiplication
}
pub struct SequenceTerm<T: Number>
{
terms: Vec<Box<dyn Term<T> + Send + Sync>>,
operation: SequenceOperations
}
impl<T: Number> SequenceTerm<T>
{
pub fn new(terms: Vec<Box<dyn Term<T> + Send + Sync>>, operation: SequenceOperations) -> SequenceTerm<T>
{
return SequenceTerm {terms, operation};
}
fn unit(&self) -> T
{
match self.operation
{
SequenceOperations::Addition => T::zero(),
SequenceOperations::Multiplication => T::one()
}
}
fn compound(&self, l: T, r: T) -> T
{
match self.operation
{
SequenceOperations::Addition => l + r,
SequenceOperations::Multiplication => l * r
}
}
}
impl<T: Number> Term<T> for SequenceTerm<T>
{
fn evaluate(&self, t: T) -> T
{
let mut computed = self.unit();
for term in &self.terms
{
computed = self.compound(computed, term.evaluate(t));
}
return computed;
}
}