つくってみた。
右の図を表現したいときは、次のように書ける。まだそれだけ。
require 'rgop'
# define nodes
start_state = RGOP::Node.new(:start) { |exec|
exec.event(:continue)
}
amount = RGOP::Node.new(:amount) { |exec|
if(exec.value[:amount] > 100)
exec.event(:yes)
else
exec.event(:no)
end
}
check = RGOP::Node.new(:check)
deliver = RGOP::Node.new(:deliver)
end_state = RGOP::Node.new(:end)
# define transitions
start_state.add_transition(:continue, amount)
amount.add_transition(:yes, check)
amount.add_transition(:no, deliver)
check.add_transition(:continue, deliver)
deliver.add_transition(:continue, end_state)
puts '# when amount is 150'
exec = RGOP::Execution.new(start_state)
exec.value[:amount] = 150
p exec.node.name # => :start
exec.event(:continue)
p exec.node.name # => :check
exec.event(:continue)
p exec.node.name # => :deliver
exec.event(:continue)
p exec.node.name # => :end
puts '# when amount is 80'
exec = RGOP::Execution.new(start_state)
exec.value[:amount] = 80
p exec.node.name # => :start
exec.event(:continue)
p exec.node.name # => :deliver
exec.event(:continue)
p exec.node.name # => :end

コメントする