class Lab42::StateMachine

Constants

VERSION

Attributes

current[RW]
designation[R]
input[RW]
options[R]
output[RW]
states[R]

Public Class Methods

new(name=nil, copy_on_nil: false, &blk) click to toggle source
# File lib/lab42/state_machine.rb, line 29
def initialize(name=nil, copy_on_nil: false, &blk)
  @options = {
    copy_on_nil: copy_on_nil,
  }
  @designation = name
  _init_vars
  _define_machine blk
end

Public Instance Methods

add(state, trigger, action, new_state=nil) click to toggle source
# File lib/lab42/state_machine.rb, line 10
def add(state, trigger, action, new_state=nil)
  s = states[state]
  s.add(trigger, action, new_state)
end
run(accumulator=nil, input=nil) click to toggle source
# File lib/lab42/state_machine.rb, line 15
def run(accumulator=nil, input=nil)
  if input
    @input = input
    @input = input.enum_for(:each) unless Enumerator === input
  end
  loop do
    accumulator = _transition(accumulator)
  end
  accumulator
end

Private Instance Methods

_current_state() click to toggle source
# File lib/lab42/state_machine.rb, line 50
def _current_state
  states[current]
end
_define_machine(blk) click to toggle source
# File lib/lab42/state_machine.rb, line 54
def _define_machine blk
  return unless blk
  DSL.new(self, &blk)
end
_init_stop_state() click to toggle source
# File lib/lab42/state_machine.rb, line 38
def _init_stop_state
  add(:stop, true, ->(_){ raise StopIteration })
  @states[:stop].freeze
end
_init_vars() click to toggle source
# File lib/lab42/state_machine.rb, line 43
def _init_vars
  @output      = []
  @current     = :start
  @states      = Hash.new{ |h, k| h[k] = State.new(k) }
  _init_stop_state
end
_transition(accumulator) click to toggle source
# File lib/lab42/state_machine.rb, line 59
def _transition(accumulator)
  next_line = input.next
  output, accumulator, next_state = _current_state.transition(accumulator, next_line)
  @current = next_state
  if output
    @output << output
  elsif options[:copy_on_nil]
    @output << next_line
  end
  accumulator
end