lib/roadie/style_attribute_builder.rb
# frozen_string_literal: true
module Roadie
class StyleAttributeBuilder
def initialize
@styles = []
end
def <<(style)
@styles << style
end
def attribute_string
Deduplicator.apply(stable_sort(@styles).map(&:to_s)).join(";")
end
private
def stable_sort(list)
# Ruby's sort is unstable for performance reasons. We need it to be
# stable, e.g. to preserve order of elements that are compared equal in
# the sorting.
# We can accomplish this by using the original array index as a second
# comparator for when the first one is equal.
list.each_with_index.sort_by { |item, index| [item, index] }.map(&:first)
end
end
end