class I18n::Tasks::Scanners::ScannerMultiplexer

Run multiple {Scanner Scanners} and merge their results. @note The scanners are run concurrently. A thread is spawned per each scanner. @since 0.9.0

Public Class Methods

new(scanners:) click to toggle source

@param scanners [Array<Scanner>]

Calls superclass method
# File lib/i18n/tasks/scanners/scanner_multiplexer.rb, line 11
def initialize(scanners:)
  super()
  @scanners = scanners
end

Public Instance Methods

keys() click to toggle source

Collect the results of all the scanners. Occurrences of a key from multiple scanners are merged.

@note The scanners are run concurrently. A thread is spawned per each scanner. @return (see Scanner#keys)

# File lib/i18n/tasks/scanners/scanner_multiplexer.rb, line 20
def keys
  Results::KeyOccurrences.merge_keys collect_results.flatten(1)
end

Private Instance Methods

collect_results() click to toggle source

@return [Array<Array<Results::KeyOccurrences>>]

# File lib/i18n/tasks/scanners/scanner_multiplexer.rb, line 27
def collect_results
  return [@scanners[0].keys] if @scanners.length == 1

  Array.new(@scanners.length).tap do |results|
    results_mutex = Mutex.new
    @scanners.map.with_index do |scanner, i|
      Thread.start do
        scanner_results = scanner.keys
        results_mutex.synchronize do
          results[i] = scanner_results
        end
      end
    end.each(&:join)
  end
end