34 lines
		
	
	
		
			718 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			718 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "hbc/topological_hash"
 | |
| 
 | |
| class Hbc::CaskDependencies
 | |
|   attr_reader :cask, :graph, :sorted
 | |
| 
 | |
|   def initialize(cask)
 | |
|     @cask = cask
 | |
|     @graph = graph_dependencies
 | |
|     @sorted = sort
 | |
|   end
 | |
| 
 | |
|   def graph_dependencies
 | |
|     deps_in = ->(csk) { csk.depends_on ? csk.depends_on.cask || [] : [] }
 | |
|     walk = lambda { |acc, deps|
 | |
|       deps.each do |dep|
 | |
|         next if acc.key?(dep)
 | |
|         succs = deps_in.call Hbc.load(dep)
 | |
|         acc[dep] = succs
 | |
|         walk.call(acc, succs)
 | |
|       end
 | |
|       acc
 | |
|     }
 | |
| 
 | |
|     graphed = walk.call({}, @cask.depends_on.cask)
 | |
|     Hbc::TopologicalHash[graphed]
 | |
|   end
 | |
| 
 | |
|   def sort
 | |
|     @graph.tsort
 | |
|   rescue TSort::Cyclic
 | |
|     raise Hbc::CaskCyclicCaskDependencyError, @cask.token
 | |
|   end
 | |
| end
 | 
