+impl Time for std::time::Instant {
+ fn now() -> Self {
+ std::time::Instant::now()
+ }
+
+ fn duration_since_epoch() -> Duration {
+ use std::time::SystemTime;
+ SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap()
+ }
+
+ fn elapsed(&self) -> Duration {
+ std::time::Instant::elapsed(self)
+ }
+}
+
+/// A state in which time has no meaning.
+pub struct Eternity;
+
+impl Time for Eternity {
+ fn now() -> Self {
+ Self
+ }
+
+ fn duration_since_epoch() -> Duration {
+ Duration::from_secs(0)
+ }
+
+ fn elapsed(&self) -> Duration {
+ Duration::from_secs(0)
+ }
+}
+
+impl Sub<Duration> for Eternity {
+ type Output = Self;
+
+ fn sub(self, _other: Duration) -> Self {
+ self
+ }
+}
+
+impl<T: Time> Writeable for ScorerUsingTime<T> {
+ #[inline]
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+ self.params.write(w)?;
+ self.channel_failures.write(w)?;
+ write_tlv_fields!(w, {});
+ Ok(())
+ }
+}
+
+impl<T: Time> Readable for ScorerUsingTime<T> {
+ #[inline]
+ fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
+ let res = Ok(Self {
+ params: Readable::read(r)?,
+ channel_failures: Readable::read(r)?,
+ });
+ read_tlv_fields!(r, {});
+ res
+ }
+}
+
+impl<T: Time> Writeable for ChannelFailure<T> {
+ #[inline]
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+ let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
+ write_tlv_fields!(w, {
+ (0, self.undecayed_penalty_msat, required),
+ (2, duration_since_epoch, required),
+ });
+ Ok(())
+ }
+}
+
+impl<T: Time> Readable for ChannelFailure<T> {
+ #[inline]
+ fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
+ let mut undecayed_penalty_msat = 0;
+ let mut duration_since_epoch = Duration::from_secs(0);
+ read_tlv_fields!(r, {
+ (0, undecayed_penalty_msat, required),
+ (2, duration_since_epoch, required),
+ });
+ Ok(Self {
+ undecayed_penalty_msat,
+ last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
+ })