class Async::Node

Represents a node in a tree, used for nested {Task} instances.

def add_child child

def add_child child
 ||= Children.new
.insert(child)
_parent(self)

def annotate(annotation)

def annotate(annotation)
	if block_given?
		previous_annotation = @annotation
		@annotation = annotation
		yield
		@annotation = previous_annotation
	else
		@annotation = annotation
	end
end

def backtrace(*arguments)

def backtrace(*arguments)
	nil
end

def children?

Whether there are children?
def children?
	@children != nil && !@children.empty?
end

def consume

the parent.
If the node has a parent, and is {finished?}, then remove this node from
def consume
	if parent = @parent and finished?
		parent.delete_child(self)
		
		if @children
			@children.each do |child|
				if child.finished?
					delete_child(child)
				else
					# In theory we don't need to do this... because we are throwing away the list. However, if you don't correctly update the list when moving the child to the parent, it foobars the enumeration, and subsequent nodes will be skipped, or in the worst case you might start enumerating the parents nodes.
					delete_child(child)
					parent.add_child(child)
				end
			end
			
			@children = nil
		end
		
		parent.consume
	end
end

def delete_child(child)

def delete_child(child)
.delete(child)
_parent(nil)

def description

def description
	@object_name ||= "#{self.class}:0x#{object_id.to_s(16)}#{@transient ? ' transient' : nil}"
	
	if @annotation
		"#{@object_name} #{@annotation}"
	else
		@object_name
	end
end

def finished?

Returns:
  • (Boolean) -
def finished?
	@children.nil? || @children.finished?
end

def initialize(parent = nil, annotation: nil, transient: false)

Parameters:
  • parent (Node, nil) -- This node will attach to the given parent.
def initialize(parent = nil, annotation: nil, transient: false)
	@parent = nil
	@children = nil
	
	@annotation = annotation
	@object_name = nil
	
	@transient = transient
	
	@head = nil
	@tail = nil
	
	if parent
		parent.add_child(self)
	end
end

def parent=(parent)

Returns:
  • (self) -

Parameters:
  • parent (Node, nil) -- the parent to attach to, or nil to detach.
def parent=(parent)
	return if @parent.equal?(parent)
	
	if @parent
		@parent.delete_child(self)
		@parent = nil
	end
	
	if parent
		parent.add_child(self)
	end
	
	return self
end

def print_backtrace(out, indent, node)

def print_backtrace(out, indent, node)
	if backtrace = node.backtrace
		backtrace.each_with_index do |line, index|
			out.puts "#{indent}#{index.zero? ? "→ " : "  "}#{line}"
		end
	end
end

def print_hierarchy(out = $stdout, backtrace: true)

def print_hierarchy(out = $stdout, backtrace: true)
	self.traverse do |node, level|
		indent = "\t" * level
		
		out.puts "#{indent}#{node}"
		
		print_backtrace(out, indent, node) if backtrace
	end
end

def set_parent parent

def set_parent parent
 parent

def stop

def stop
	@children&.each(&:stop)
end

def to_s

def to_s
	"\#<#{description}>"
end

def transient?

Is this node transient?
def transient?
	@transient
end

def traverse(level = 0, &block)

Other tags:
    Yield: - The node and the level relative to the given root.
def traverse(level = 0, &block)
	yield self, level
	
	@children&.each do |child|
		child.traverse(level + 1, &block)
	end
end