lib/syntropy/file_watch.rb



# frozen_string_literal: true

module Syntropy
  def self.file_watch(machine, *roots, period: 0.1, &block)
    raise 'Missing root paths' if roots.empty?

    require 'listen'

    queue = Thread::Queue.new
    listener = Listen.to(*roots) do |modified, added, removed|
      modified.each { queue.push([:modified, it]) }
      added.each    { queue.push([:added, it]) }
      removed.each  { queue.push([:removed, it]) }
    end
    listener.start

    loop do
      machine.sleep(period) while queue.empty?
      event, fn = queue.shift
      block.call(event, fn)
    end
  rescue StandardError => e
    p e
    p e.backtrace
  ensure
    listener.stop
  end
end