class Pgvector::Vector

def self.from_binary(string)

def self.from_binary(string)
  dim, unused = string[0, 4].unpack("nn")
  raise "expected unused to be 0" if unused != 0
  Vector.new(string[4..-1].unpack("g#{dim}"))
end

def self.from_text(string)

def self.from_text(string)
  Vector.new(string[1..-2].split(",").map(&:to_f))
end

def initialize(data)

def initialize(data)
  # keep as NArray when possible for performance
  @data =
    if numo?(data)
      data.cast_to(Numo::SFloat)
    else
      data.to_a.map(&:to_f)
    end
end

def numo?(data)

def numo?(data)
  defined?(Numo::NArray) && data.is_a?(Numo::NArray)
end

def to_a

def to_a
  @data.to_a
end

def to_binary

def to_binary
  if numo?(@data)
    [@data.shape[0], 0].pack("s>s>") + @data.to_network.to_binary
  else
    buffer = [@data.size, 0].pack("s>s>")
    @data.pack("g*", buffer: buffer)
    buffer
  end
end

def to_s

def to_s
  "[#{@data.to_a.map(&:to_f).join(",")}]"
end