Skip to content

Commit

Permalink
made main method's code more readable
Browse files Browse the repository at this point in the history
  • Loading branch information
dubadub committed Jun 7, 2014
1 parent 8df0674 commit d797c59
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions lib/topo_sort.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,7 @@ class Cyclic < StandardError; end
def sort(nodes)
@sorted = []

@vertices = nodes.inject({}) do |memo, (node, dependency)|
memo[node] = OpenStruct.new(
name: node,
dependency: dependency,
marked: false, #store the vertex has been visited by dfs
on_stack: false #to detect cycle
)
memo
end
@vertices = populate_vertices(nodes)

nodes.each{ |(node, dep)| visit(@vertices[node]) unless @vertices[node].marked }

Expand All @@ -40,15 +32,29 @@ def sort(nodes)
def visit(vertice)
vertice.marked = true
vertice.on_stack = true

if vertice.dependency && dependency = @vertices[vertice.dependency]
raise SelfDependency.new("sort failed: detected self-dependency for '#{vertice.name}'") if dependency == vertice
raise Cyclic.new("sort failed: detected cyclic dependency '#{vertice.name} => #{dependency.name}'") if dependency.on_stack
visit(dependency) unless dependency.marked
end

vertice.on_stack = false

@sorted.push vertice.name
end

def populate_vertices(nodes)
nodes.inject({}) do |memo, (node, dependency)|
memo[node] = OpenStruct.new(
name: node,
dependency: dependency,
marked: false, #store the vertex has been visited by dfs
on_stack: false #to detect cycle
)
memo
end
end

end

0 comments on commit d797c59

Please sign in to comment.