use std::{cmp::Ordering, fmt};
#[derive(Debug, Eq, Clone)]
pub struct HuffmanNode {
character: Option<char>,
frequency: u32,
left: Option<Box<HuffmanNode>>,
right: Option<Box<HuffmanNode>>,
}
impl fmt::Display for HuffmanNode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let left_character : Option<char> = match &self.left {
Some(node) => node.character,
None => None,
};
let right_character : Option<char> = match &self.right {
Some(node) => node.character,
None => None,
};
write!(
f,
"(val: {:?}, f: {}, l: {:?}, r: {:?})",
self.character, self.frequency, left_character, right_character
)
}
}
impl HuffmanNode {
pub fn new(
character: Option<char>,
frequency: u32,
left: Option<Box<HuffmanNode>>,
right: Option<Box<HuffmanNode>>,
) -> Self {
HuffmanNode {
character,
frequency,
left,
right,
}
}
pub fn character(&self) -> Option<char> {
self.character
}
pub fn frequency(&self) -> u32 {
self.frequency
}
pub fn left(&self) -> Option<&HuffmanNode> {
self.left.as_ref().map(|node| node.as_ref())
}
pub fn right(&self) -> Option<&HuffmanNode> {
self.right.as_ref().map(|node| node.as_ref())
}
}
impl Ord for HuffmanNode {
fn cmp(&self, other: &Self) -> Ordering {
self.frequency.cmp(&other.frequency).reverse()
}
}
impl PartialOrd for HuffmanNode {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl PartialEq for HuffmanNode {
fn eq(&self, other: &Self) -> bool {
self.frequency == other.frequency
}
}