class Build::Files::Composite

def +(list)

def +(list)
	if list.kind_of? Composite
		self.class.new(@files + list.files)
	else
		self.class.new(@files + [list])
	end
end

def each

def each
	return to_enum(:each) unless block_given?
	
	@files.each do |files|
		files.each{|path| yield path}
	end
end

def eql?(other)

def eql?(other)
	self.class.eql?(other.class) and @files.eql?(other.files)
end

def freeze

def freeze
	self.roots
	
	super
end

def hash

def hash
	@files.hash
end

def include?(path)

def include?(path)
	@files.any? {|list| list.include?(path)}
end

def initialize(files, roots = nil)

def initialize(files, roots = nil)
	@files = []
	
	files.each do |list|
		if list.kind_of? Composite
			@files += list.files
		elsif List.kind_of? List
			@files << list
		else
			# Try to convert into a explicit paths list:
			@files << Paths.new(list)
		end
	end
	
	@files.freeze
	@roots = roots
end

def inspect

def inspect
	"<Composite #{@files.inspect}>"
end

def rebase(root)

def rebase(root)
	self.class.new(@files.collect{|list| list.rebase(root)}, [root])
end

def roots

def roots
	@roots ||= @files.collect(&:roots).flatten.uniq
end

def to_paths

def to_paths
	self.class.new(@files.collect(&:to_paths), roots: @roots)
end