use crate::catalog::ArithmeticPos;
use std::fmt;
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub(crate) struct Collection {
fingerprint: u64,
name: String,
key_argument_signatures: Vec<ArithmeticPos>,
value_argument_signatures: Vec<ArithmeticPos>,
}
impl Collection {
pub(crate) fn new(
fingerprint: u64,
name: String,
key_argument_signatures: &[ArithmeticPos],
value_argument_signatures: &[ArithmeticPos],
) -> Self {
Self {
fingerprint,
name,
key_argument_signatures: key_argument_signatures.to_vec(),
value_argument_signatures: value_argument_signatures.to_vec(),
}
}
#[inline]
pub(crate) fn arity(&self) -> (usize, usize) {
(
self.key_argument_signatures.len(),
self.value_argument_signatures.len(),
)
}
pub(crate) fn is_k_only(&self) -> bool {
self.value_argument_signatures.is_empty()
}
pub(crate) fn fingerprint(&self) -> u64 {
self.fingerprint
}
}
impl fmt::Display for Collection {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let k = self
.key_argument_signatures
.iter()
.map(ToString::to_string)
.collect::<Vec<_>>()
.join(", ");
let v = self
.value_argument_signatures
.iter()
.map(ToString::to_string)
.collect::<Vec<_>>()
.join(", ");
if self.name.is_empty() {
write!(f, "0x{:016x}, key:({}), value:({})", self.fingerprint, k, v)
} else {
write!(
f,
"{} [0x{:016x}], key:({}), value:({})",
self.name, self.fingerprint, k, v
)
}
}
}