Skip to content

Instantly share code, notes, and snippets.

@fuzzy
Created March 29, 2012 22:39
Show Gist options
  • Save fuzzy/2244456 to your computer and use it in GitHub Desktop.
Save fuzzy/2244456 to your computer and use it in GitHub Desktop.
Simple but functional dependancy resolution
#!/usr/bin/env ruby
class Graph
attr_accessor :items, :retv
def initialize(items=nil)
if items != nil
@items = items
@retv = []
end
end
def get_itm(name=nil)
@items.each {|rv| return rv if rv[ :name ] == name }
return nil
end
def add_dep(dep=nil)
@retv.each {|i| return false if i[:name] == dep[:name] }
@retv.push(dep)
return true
end
def resolve(item=nil)
if item[ :depends ] == nil or item[ :depends ].size == 0
add_dep(item)
else
item[ :depends ].each {|a|
dep = get_itm(a)
self.resolve(dep)
add_dep(dep)
}
add_dep(item)
end
end
def graph
@items.each {|item| self.resolve(item) }
end
end
o = [{:name => 'A', :depends => nil, :provides => ['A']},
{:name => 'B', :depends => ['A','D'], :provides => ['B']},
{:name => 'C', :depends => ['D','E'], :provides => ['C']},
{:name => 'D', :depends => ['A','E'], :provides => ['D']},
{:name => 'E', :depends => ['A'], :provides => ['E']}]
obj = Graph.new(o)
puts '='*50+"\n\nBefore:\n"+'-'*50
obj.items.each {|t| puts "N: "+t[:name] }
obj.graph
puts "\n"+'='*50+"\n"
puts "\nAfter:\n"+'-'*50+"\n"
obj.retv.each {|t| puts "N: "+t[:name] }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment