use std::cmp::Ordering; /// Helper struct to associate an item with its priority #[derive(Debug, Clone, Copy)] // I mean I guess P should be Ord but I want to use f64 so whatever pub struct Item { data: D, priority: P, } impl Item { /// Creates a new instance fn new(data: D, priority: P) -> Self { Self { data, priority } } /// Retrieve the internal data, it would be nicer to implement this using [`From`] or [`Into`], but I don't see a way to do that using generics fn data(self) -> D { self.data } } // The relevant Ord implementations are based just on the priority impl Ord for Item { fn cmp(&self, other: &Self) -> Ordering { // Yeah this is bad design // My excuse is that i'm still learning Rust self.priority .partial_cmp(&other.priority) .unwrap_or(Ordering::Equal) } } impl PartialOrd for Item { fn partial_cmp(&self, other: &Self) -> Option { self.priority.partial_cmp(&other.priority) } } impl PartialEq for Item { fn eq(&self, other: &Self) -> bool { self.priority == other.priority } } impl Eq for Item {}