use crate::applicable::ProjectionOf;
use crate::communicator::Acceptance;
use crate::communicator::Vote;
use crate::node::Snapshot;
use crate::node_builder::NodeBuilderBlank;
use crate::state;
use crate::state::State;
use crate::Commit;
use crate::Conflict;
use crate::CoordNum;
use crate::LogEntry;
use crate::NodeInfo;
use crate::Promise;
use crate::RoundNum;
pub type AbstainOf<I> = <I as Invocation>::Abstain;
pub type CommunicationErrorOf<I> = <I as Invocation>::CommunicationError;
pub type ContextOf<I> = state::ContextOf<StateOf<I>>;
pub type CoordNumOf<I> = <I as Invocation>::CoordNum;
pub type EffectOf<I> = state::EffectOf<StateOf<I>>;
pub type EjectionOf<I> = <I as Invocation>::Ejection;
pub type FrozenStateOf<I> = state::FrozenOf<StateOf<I>>;
pub type LogEntryOf<I> = state::LogEntryOf<StateOf<I>>;
pub type LogEntryIdOf<I> = <LogEntryOf<I> as LogEntry>::Id;
pub type NayOf<I> = <I as Invocation>::Nay;
pub type NodeOf<I> = state::NodeOf<StateOf<I>>;
pub type NodeIdOf<I> = <NodeOf<I> as NodeInfo>::Id;
pub type OutcomeOf<I> = state::OutcomeOf<StateOf<I>>;
pub type RoundNumOf<I> = <I as Invocation>::RoundNum;
pub type StateOf<I> = <I as Invocation>::State;
pub type YeaOf<I> = <I as Invocation>::Yea;
pub type AcceptanceFor<I> = Acceptance<CoordNumOf<I>, LogEntryOf<I>, YeaOf<I>, NayOf<I>>;
pub type CommitFor<I, A = LogEntryOf<I>> =
Commit<StateOf<I>, RoundNumOf<I>, ProjectionOf<A, StateOf<I>>>;
pub type ConflictFor<I> = Conflict<CoordNumOf<I>, LogEntryOf<I>>;
pub type PromiseFor<I> = Promise<RoundNumOf<I>, CoordNumOf<I>, LogEntryOf<I>>;
pub type SnapshotFor<I> = Snapshot<StateOf<I>, RoundNumOf<I>, CoordNumOf<I>>;
pub type VoteFor<I> = Vote<RoundNumOf<I>, CoordNumOf<I>, LogEntryOf<I>, AbstainOf<I>>;
pub trait Invocation: Send + Sized + 'static {
type RoundNum: RoundNum;
type CoordNum: CoordNum;
type State: State;
type Yea: std::fmt::Debug + Send + Sync + 'static;
type Nay: std::fmt::Debug + Send + Sync + 'static;
type Abstain: std::fmt::Debug + Send + Sync + 'static;
type Ejection: From<state::ErrorOf<Self::State>> + std::fmt::Debug + Send + Sync + 'static;
type CommunicationError: std::fmt::Debug + Send + Sync + 'static;
fn node_builder() -> NodeBuilderBlank<Self> {
NodeBuilderBlank::new()
}
}