remediate 0.2.1

Library for thinking and learning
Documentation
use rkyv::{Archive, Archived, Deserialize, Fallible, Serialize};
use std::cmp::{self, Ordering};

#[derive(Debug)]
pub struct Reverse<T>(cmp::Reverse<T>);

impl<T> Reverse<T> {
    pub fn new(data: T) -> Self {
        Self(cmp::Reverse(data))
    }

    pub fn get_ref(&self) -> &T {
        &(self.0).0
    }

    pub fn get_mut(&mut self) -> &T {
        &mut (self.0).0
    }

    pub fn get(self) -> T {
        (self.0).0
    }
}

impl<T: Ord> Ord for Reverse<T> {
    fn cmp(&self, other: &Self) -> Ordering {
        self.0.cmp(&other.0)
    }
}

impl<T: PartialOrd> PartialOrd for Reverse<T> {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        self.0.partial_cmp(&other.0)
    }
}

impl<T: PartialEq> PartialEq for Reverse<T> {
    fn eq(&self, other: &Self) -> bool {
        &self.0 == &other.0
    }
}

impl<T: Eq> Eq for Reverse<T> {}

impl<T: Archive> Archive for Reverse<T> {
    type Archived = T::Archived;
    type Resolver = T::Resolver;

    unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
        self.get_ref().resolve(pos, resolver, out)
    }
}

impl<S: Fallible + ?Sized, T: Serialize<S>> Serialize<S> for Reverse<T> {
    fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, <S as Fallible>::Error> {
        self.get_ref().serialize(serializer)
    }
}

impl<D: Fallible + ?Sized, T: Archive> Deserialize<Reverse<T>, D> for Archived<T>
where
    Archived<T>: Deserialize<T, D>,
{
    fn deserialize(&self, deserializer: &mut D) -> Result<Reverse<T>, <D as Fallible>::Error> {
        Ok(Reverse(cmp::Reverse(self.deserialize(deserializer)?)))
    }
}