Sha256: f1861c17610820837b1772b3f411e5bef458d6f8dcce2e3a76b89f1ad9dbbfc4

Contents?: true

Size: 908 Bytes

Versions: 4

Compression:

Stored size: 908 Bytes

Contents

require 'set'

module Perforated
  class Rebuilder
    attr_reader :parser, :strings

    def initialize(strings, parser = Perforated.json)
      @strings = strings
      @parser  = parser
    end

    def rebuild(rooted: false)
      if rooted
        parser.dump(merge(parser.load(concatenated)))
      else
        concatenated
      end
    end

    def concatenated
      "[#{strings.join(',')}]"
    end

    private

    def merge(objects)
      merged = objects.each_with_object({}) do |object, memo|
        object.each do |key, value|
          memo[key] ||= Set.new

          if value.is_a?(Array)
            memo[key].merge(value)
          else
            memo[key].add(value)
          end
        end
      end

      sets_to_arrays(merged)
    end

    def sets_to_arrays(merged)
      merged.each do |key, value|
        merged[key] = value.to_a
      end

      merged
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
perforated-0.10.1 lib/perforated/rebuilder.rb
perforated-0.10.0 lib/perforated/rebuilder.rb
perforated-0.9.1 lib/perforated/rebuilder.rb
perforated-0.9.0 lib/perforated/rebuilder.rb