class Rails::Generators::AppBase

def deduce_implied_options(options, option_reasons, meta_options)

def deduce_implied_options(options, option_reasons, meta_options)
  active = options.transform_values { |value| [] if value }.compact
  irrevocable = (active.keys - meta_options).to_set
  deduction_order = TSort.tsort(
    ->(&block) { option_reasons.each_key(&block) },
    ->(key, &block) { option_reasons[key]&.each(&block) }
  )
  deduction_order.each do |name|
    active_reasons = option_reasons[name].to_a.select(&active)
    active[name] ||= active_reasons if active_reasons.any?
    irrevocable << name if active_reasons.any?(irrevocable)
  end
  revoked = options.select { |name, value| value == false }.keys.to_set - irrevocable
  deduction_order.reverse_each do |name|
    revoked += option_reasons[name].to_a if revoked.include?(name)
  end
  revoked -= meta_options
  active.filter_map do |name, reasons|
    unless revoked.include?(name) || reasons.all?(revoked)
      [name, reasons - revoked.to_a]
    end
  end.to_h
end