class Pastafari::Fsm

Attributes

current_state[R]
states[R]
transition_at[R]

Public Class Methods

build(&block) click to toggle source
# File lib/pastafari/fsm.rb, line 5
def self.build(&block)
  raise ArgumentError unless block

  builder = Builders::FsmBuilder.new
  builder.instance_eval(&block)

  builder.build
end
new(states, transition_at, initial_state) click to toggle source
# File lib/pastafari/fsm.rb, line 22
def initialize(states, transition_at, initial_state)
  @transition_at = transition_at
  @states = states
  @current_state = initial_state || states.first
end

Public Instance Methods

run(input) click to toggle source
# File lib/pastafari/fsm.rb, line 14
def run(input)
  Array(input).map { |value| process(value) }
end

Private Instance Methods

process(input) click to toggle source
# File lib/pastafari/fsm.rb, line 28
def process(input)
  transition!(input) if transition_at == :before

  output = states[current_state].process(input)

  transition!(input) if transition_at == :after

  output
end
transition!(input) click to toggle source
# File lib/pastafari/fsm.rb, line 38
def transition!(input)
  new_state = states[current_state].evaluate_transitions(input)

  @current_state = new_state if new_state
end