From d797c59ac1f428ab779de11cbfa9c2d1a21ba413 Mon Sep 17 00:00:00 2001 From: Alex Dubovskoy Date: Sat, 7 Jun 2014 20:36:28 +0400 Subject: [PATCH] made main method's code more readable --- lib/topo_sort.rb | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/topo_sort.rb b/lib/topo_sort.rb index 6e09ba7..9489bd0 100644 --- a/lib/topo_sort.rb +++ b/lib/topo_sort.rb @@ -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 } @@ -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