module Build::Files

def self.run_with_fsevent(monitor, options = {}, &block)

def self.run_with_fsevent(monitor, options = {}, &block)
	require 'rb-fsevent'
	
	notifier = FSEvent.new
	
	catch(:interrupt) do
		while true
			notifier.watch monitor.roots do |directories|
				directories.collect!{|directory| File.expand_path(directory)}
				
				monitor.update(directories)
				
				yield
				
				if monitor.updated
					notifier.stop
				end
			end
			
			notifier.run
		end
	end
end

def self.run_with_inotify(monitor, options = {}, &block)

def self.run_with_inotify(monitor, options = {}, &block)
	require 'rb-inotify'
	
	notifier = INotify::Notifier.new
	
	catch(:interrupt) do
		while true
			monitor.roots.each do |root|
				notifier.watch root, :create, :modify, :delete do |event|
					monitor.update([root])
					
					yield
					
					if monitor.updated
						notifier.stop
					end
				end
			end
			
			notifier.run
		end
	end
end

def self.run_with_polling(monitor, options = {}, &block)

def self.run_with_polling(monitor, options = {}, &block)
	catch(:interrupt) do
		while true
			monitor.update(monitor.roots)
			
			yield
			
			sleep(options[:latency] || 1.0)
		end
	end
end