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 |