module Dependz::SortDepth
Public Instance Methods
sort_depth()
click to toggle source
# File lib/dependz/sort_depth.rb, line 7 def sort_depth depth_of_all_item = roots .map { |root| calculate_depth_from_root(dag, root) } .reduce { |acc, depths| acc.merge(depths) { |_key, a, b| [a, b].max } } format(depth_of_all_item) end
Private Instance Methods
calculate_depth_from_root(dag, root)
click to toggle source
# File lib/dependz/sort_depth.rb, line 30 def calculate_depth_from_root(dag, root) @depth = 0 @depth_map = {} visitor = dfs_visitor(dag) dag.reverse.depth_first_visit(root, visitor) { |x| } @depth_map end
dfs_visitor(dag)
click to toggle source
# File lib/dependz/sort_depth.rb, line 40 def dfs_visitor(dag) RGL::DFSVisitor.new(dag.reverse).tap do |visitor| visitor.set_examine_vertex_event_handler do |v| @depth += 1 @depth_map[v] = @depth end visitor.set_finish_vertex_event_handler do |_v| @depth -= 1 end end end
format(depth_mapping)
click to toggle source
# File lib/dependz/sort_depth.rb, line 17 def format(depth_mapping) depth_mapping.each_with_object([]) do |item_depth, result| item = item_depth[0] depth = item_depth[1] - 1 if result[depth].nil? result[depth] = [item] else result[depth].push(item) end end end
roots()
click to toggle source
# File lib/dependz/sort_depth.rb, line 53 def roots depend_ons = list.map { |d| d[:depend_on] }.uniq depend_bys = list.map { |d| d[:depend_by] }.uniq depend_ons.reject { |head| depend_bys.include?(head) } end