pipecircuit 0.0.19

Correct. Robust. Fast. Portable. Pick four.
Documentation
#[cfg(feature = "storage")]
mod ledger;

use core::marker::PhantomData;

use crate::{Pipe, WakeAfter};

#[cfg(feature = "storage")]
pub use ledger::{
    DelayAdmission, DelayAdmissionOutcome, DelayArmMismatch, DelayArmOutcome, DelayArmRefusal,
    DelayLedger, DelayLedgerCreationError, DelayLedgerCreationFailure, DelayRefusalOutcome,
    DelayReleaseOutcome, DelayUnavailable, DelayWithdrawalOutcome,
};

pub struct After<Message>(PhantomData<fn() -> Message>);

impl<Message: 'static> Pipe for After<Message> {
    type In<'message> = Delayed<Message>;
    type Out<'message> = Message;
}

#[must_use = "delayed work must be sent through a delayed pipe"]
pub struct Delayed<Message> {
    message: Message,
    wake_after: WakeAfter,
}

impl<Message> Delayed<Message> {
    pub const fn new(message: Message, wake_after: WakeAfter) -> Self {
        Self {
            message,
            wake_after,
        }
    }

    pub const fn message(&self) -> &Message {
        &self.message
    }

    pub const fn wake_after(&self) -> WakeAfter {
        self.wake_after
    }

    pub fn into_parts(self) -> (Message, WakeAfter) {
        (self.message, self.wake_after)
    }
}

#[cfg(all(kani, feature = "storage"))]
mod proofs;
#[cfg(test)]
mod tests;