lib/unicode/display_width/index.rb



# frozen_string_literal: true

require "zlib"
require_relative "constants"

module Unicode
  class DisplayWidth
    File.open(INDEX_FILENAME, "rb") do |file|
      serialized_data = Zlib::GzipReader.new(file).read
      serialized_data.force_encoding Encoding::BINARY
      INDEX = Marshal.load(serialized_data)
    end

    def self.decompress_index(index, level)
      index.flat_map{ |value|
        if level > 0
          if value.instance_of?(Array)
            value[15] ||= nil
            decompress_index(value, level - 1)
          else
            decompress_index([value] * 16, level - 1)
          end
        else
          if value.instance_of?(Array)
            value[15] ||= nil
            value
          else
            [value] * 16
          end
        end
      }
    end
  end
end