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