1use crate::{EncodeValue, Result, Tagged};
4use core::{cmp::Ordering, marker::PhantomData};
5
6pub trait DerOrd {
14 fn der_cmp(&self, other: &Self) -> Result<Ordering>;
17}
18
19pub trait ValueOrd {
23 fn value_cmp(&self, other: &Self) -> Result<Ordering>;
26}
27
28impl<T> DerOrd for T
29where
30 T: EncodeValue + ValueOrd + Tagged,
31{
32 fn der_cmp(&self, other: &Self) -> Result<Ordering> {
33 match self.header()?.der_cmp(&other.header()?)? {
34 Ordering::Equal => self.value_cmp(other),
35 ordering => Ok(ordering),
36 }
37 }
38}
39
40pub trait OrdIsValueOrd: Ord {}
45
46impl<T> ValueOrd for T
47where
48 T: OrdIsValueOrd,
49{
50 fn value_cmp(&self, other: &Self) -> Result<Ordering> {
51 Ok(self.cmp(other))
52 }
53}
54
55pub(crate) fn iter_cmp<'a, I, T: 'a>(a: I, b: I) -> Result<Ordering>
57where
58 I: Iterator<Item = &'a T> + ExactSizeIterator,
59 T: DerOrd,
60{
61 let length_ord = a.len().cmp(&b.len());
62
63 for (value1, value2) in a.zip(b) {
64 match value1.der_cmp(value2)? {
65 Ordering::Equal => (),
66 other => return Ok(other),
67 }
68 }
69
70 Ok(length_ord)
71}
72
73impl<T> ValueOrd for PhantomData<T> {
75 fn value_cmp(&self, _other: &Self) -> Result<Ordering> {
76 Ok(Ordering::Equal)
77 }
78}
79
80impl<T> DerOrd for PhantomData<T> {
82 fn der_cmp(&self, _other: &Self) -> Result<Ordering> {
83 Ok(Ordering::Equal)
84 }
85}