local vector = {}
vector.__index = vector

local function new(x, y)
  if type(x) == "table" then
    return setmetatable({
      x = x[1],
      y = y[1]
    }, vector)
  else
    return setmetatable({
      x = x or 0,
      y = y or 0
    }, vector)
  end
end

function vector.__add(a, b)
  return new(a.x + b.x, a.y + b.y)
end

function vector.__sub(a, b)
  return new(a.x - b.x, a.y - b.y)
end

function vector.__mul(a, b)
  if type(b) == "number" then
    return new(a.x * b, a.y * b)
  else
    return a.x * b.x + a.y * b.y
  end
end

function vector.__div(a, b)
  return new(a.x / b, a.y / b)
end

function vector.__eq(a, b)
  return a.x == b.x and a.y == b.y
end

function vector:dist(b)
  return math.sqrt(math.pow(b.x - self.x, 2) + math.pow(b.y-self.y, 2))
end

function vector:unpack()
  return self.x, self.y
end

function vector:rotate(theta)
  return new((math.cos(theta) * self.x) - (math.sin(theta) * self.y),
            (math.sin(theta) * self.x) + (math.cos(theta) * self.y))
end

function vector:scale(sx, sy)
  return new(self.x * sx, self.y * sy)
end

return setmetatable({new = new}, {__call = function(_, ...) return new(...) end})
