amaru_kernel/cardano/
ordered_redeemer.rs1use std::{borrow::Cow, cmp::Ordering, ops::Deref};
16
17use crate::{AsIndex, Redeemer};
18
19#[derive(Clone, Debug, PartialEq, Eq)]
22pub struct OrderedRedeemer<'a>(Cow<'a, Redeemer>);
23
24impl Ord for OrderedRedeemer<'_> {
25 fn cmp(&self, other: &Self) -> Ordering {
26 match self.tag.as_index().cmp(&other.tag.as_index()) {
27 by_tag @ Ordering::Less | by_tag @ Ordering::Greater => by_tag,
28 Ordering::Equal => self.index.cmp(&other.index),
29 }
30 }
31}
32
33impl PartialOrd for OrderedRedeemer<'_> {
34 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
35 Some(self.cmp(other))
36 }
37}
38
39impl Deref for OrderedRedeemer<'_> {
40 type Target = Redeemer;
41
42 fn deref(&self) -> &Self::Target {
43 &self.0
44 }
45}
46
47impl<'a> From<Cow<'a, Redeemer>> for OrderedRedeemer<'a> {
48 fn from(value: Cow<'a, Redeemer>) -> Self {
49 Self(value)
50 }
51}
52
53impl From<Redeemer> for OrderedRedeemer<'static> {
54 fn from(value: Redeemer) -> Self {
55 Self(Cow::Owned(value))
56 }
57}
58
59impl<'a> From<&'a Redeemer> for OrderedRedeemer<'a> {
60 fn from(value: &'a Redeemer) -> Self {
61 Self(Cow::Borrowed(value))
62 }
63}