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