use PartialOrd and PartialEq instead of Eq and Ord