use crate::noun::{Order, NounId};
use crate::reduce::{Outcome, ErrorKind, evaluate};
use crate::call::CallProvider;
pub fn hash<const N: usize>(
order: &mut Order<N>, object: NounId, body: NounId, budget: u64, hints: &dyn CallProvider<N>,
) -> Outcome {
let (input, budget) = match evaluate(order, object, body, budget, hints) { Ok(v) => v, Err(o) => return o };
let digest = *order.digest(input);
match order.hash_noun(&digest) {
Some(r) => Outcome::Ok(r, budget),
None => Outcome::Error(ErrorKind::Unavailable),
}
}