class Ecu::SignalListComparison

def initialize(left, right)

def initialize(left, right)
  unless left.is_a?(SignalList) && right.is_a?(SignalList)
    fail "Can only merge SignalLists (left: #{left.class}, right: #{right.class})!"
  end
  @left               = left.map(&:name)
  @right              = right.map(&:name)
  @unified_headers    = left.headers + right.headers
  @unified_subheaders = left.subheaders + right.subheaders
  @names              = Hash.new
end

def left_exclusive

def left_exclusive
  names(:left_exclusive).map { |name| left.fetch(name) }
end

def merge(priority: :right)

def merge(priority: :right)
  SignalList.new \
    (
     names(:left_exclusive).map  { |n| left.fetch(n) } +
     names(:right_exclusive).map { |n| right.fetch(n) } +
     names(:common).map { |n| left.fetch(n) }
    ),
    @unified_headers,
    @unified_subheaders
end

def names(criterion)

def names(criterion)
  @names[criterion] ||= \
    case criterion
    when :left_exclusive  then left - right
    when :right_exclusive then right - left
    when :common          then left & right
    when :equal           then left & right
    when :nonequal        then []
    else fail "Unknown criterion #{criterion}"
    end
end

def right_exclusive

def right_exclusive
  names(:right_exclusive).map { |name| right.fetch(name) }
end