class EacRubyUtils::Fs::Traverser

def boolean_value(source_value)

def boolean_value(source_value)
  source_value = source_value.call if source_value.respond_to?(:call)
  source_value ? true : false
end

def check_path(path)

def check_path(path)
  path = ::Pathname.new(path.to_s) unless path.is_a?(::Pathname)
  internal_check_path(path, 0)
end

def each_child(dir, &block)

def each_child(dir, &block)
  if sort?
    dir.each_child.sort_by { |p| [p.to_s] }.each(&block)
  else
    dir.each_child(&block)
  end
end

def hidden_directories?

def hidden_directories?
  boolean_value(hidden_directories)
end

def inner_check_directory(dir, level)

def inner_check_directory(dir, level)
  return unless process_directory?(level)
  user_check_directory(dir)
  each_child(dir) do |e|
    next unless !e.basename.to_s.start_with?('.') || hidden_directories?
    internal_check_path(e, level + 1)
  end
end

def internal_check_path(path, level)

def internal_check_path(path, level)
  if path.file?
    user_check_file(path)
  elsif path.directory?
    inner_check_directory(path, level)
  else
    raise "Unknown filesystem object: #{path}"
  end
end

def process_directory?(level)

def process_directory?(level)
  level.zero? || recursive?
end

def recursive?

def recursive?
  boolean_value(recursive)
end

def sort?

def sort?
  boolean_value(sort)
end

def user_check_directory(path)

def user_check_directory(path)
  check_directory&.call(path)
end

def user_check_file(path)

def user_check_file(path)
  check_file&.call(path)
end