From 2a24bf156480479843a7f17d36eb54320127ee93 Mon Sep 17 00:00:00 2001 From: William Banfield Date: Fri, 18 Feb 2022 17:36:18 -0500 Subject: [PATCH] stepper: initial passing test --- internal/consensus/stepper/stepper.go | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 internal/consensus/stepper/stepper.go diff --git a/internal/consensus/stepper/stepper.go b/internal/consensus/stepper/stepper.go new file mode 100644 index 000000000..dd5219a4c --- /dev/null +++ b/internal/consensus/stepper/stepper.go @@ -0,0 +1,45 @@ +package stepper + +import ( + "errors" + + "github.com/tendermint/tendermint/internal/consensus/types" +) + +var ( + ErrNoValidTransition = errors.New("no valid transition") +) + +type ( + Transition func(types.RoundState) types.RoundState + Predicate func(types.RoundState) bool +) + +var emptyTransition = func(types.RoundState) types.RoundState { return types.RoundState{} } + +type Operation struct { + P Predicate + T Transition +} + +type stepper struct { + ops []Operation +} + +func New(ops []Operation) stepper { + return stepper{ops: ops} +} + +func (s *stepper) Next(state types.RoundState) (types.RoundState, error) { + if t, ok := s.pickTransition(state); ok { + return t(state), nil + } + return types.RoundState{}, ErrNoValidTransition +} + +func (s *stepper) pickTransition(state types.RoundState) (Transition, bool) { + for _, op := range s.ops { + return op.T, true + } + return emptyTransition, false +}