use essential_types::{contract::Contract, ContentAddress, Hash};
pub fn from_contract(contract: &Contract) -> ContentAddress {
let predicate_addrs = contract.predicates.iter().map(crate::content_addr);
from_predicate_addrs(predicate_addrs, &contract.salt)
}
pub fn from_predicate_addrs(
predicate_addrs: impl IntoIterator<Item = ContentAddress>,
salt: &Hash,
) -> ContentAddress {
let mut predicate_addrs: Vec<_> = predicate_addrs.into_iter().collect();
from_predicate_addrs_slice(&mut predicate_addrs, salt)
}
pub fn from_predicate_addrs_slice(
predicate_addrs: &mut [ContentAddress],
salt: &Hash,
) -> ContentAddress {
predicate_addrs.sort();
ContentAddress(crate::hash_bytes_iter(
predicate_addrs
.iter()
.map(|addr| addr.0.as_slice())
.chain(Some(salt.as_slice())),
))
}