diff --git a/node.rb b/node.rb new file mode 100644 index 0000000..98a35c7 --- /dev/null +++ b/node.rb @@ -0,0 +1,33 @@ +require 'rubygems' +require 'eventmachine' + +class Node + attr_accessor :parent + + def initialize(&strategy) + @children = [] + @strategy = strategy + end + + def <<(child) + child.parent = self + @children << child + end + + def run + deferrable = @strategy.call + deferrable.callback do + puts "Strategy succeeded" + EM.next_tick(method(:run_children)) + end + deferrable.errback do + puts "Strategy failed" + end + end + + def run_children + @children.each do |child| + child.run + end + end +end diff --git a/test.rb b/test.rb new file mode 100644 index 0000000..74b0ecd --- /dev/null +++ b/test.rb @@ -0,0 +1,31 @@ +require 'node' + +def create_deferrable(id) + deferrable = EM::DefaultDeferrable.new + deferrable.callback do + puts "Finished node #{id}" + end + EM::Timer.new(1) do + deferrable.succeed + end + deferrable +end + +EM.run { + n1 = Node.new do + create_deferrable(1) + end + + n2 = Node.new do + create_deferrable(2) + end + + n3 = Node.new do + create_deferrable(3) + end + + n1 << n2 + n1 << n3 + + n1.run +}