use stack::Stack;
use expression::Expression;
use variable::DummyVariable;
mod float;
mod integer;
pub use self::float::{FloatEvaluator, FloatErr, FloatEvaluateErr};
pub use self::integer::{IntEvaluator, IntErr, IntEvaluateErr};
pub type FloatExpr<T> = Expression<T, DummyVariable, FloatEvaluator<T>>;
pub type IntExpr<T> = Expression<T, DummyVariable, IntEvaluator<T>>;
pub type VariableFloatExpr<T, V> = Expression<T, V, FloatEvaluator<T>>;
pub type VariableIntExpr<T, V> = Expression<T, V, IntEvaluator<T>>;
pub trait Evaluate<T> {
type Err;
fn operands_needed(&self) -> usize;
fn operands_generated(&self) -> usize;
fn evaluate(self, stack: &mut Stack<T>) -> Result<(), Self::Err>;
}