module Engine

export Construction, Sphere, mprod, point

using LinearAlgebra
using Groebner

mutable struct Construction
  nextid::Int64
  
  Construction(; nextid = 0) = new(nextid)
end

struct Sphere{T<:Number}
  vec::Vector{T}
  id
  
  function Sphere(vec::Vector{T}, ctx::Construction) where T <: Number
    id = ctx.nextid
    ctx.nextid += 1
    new{T}(vec, id)
  end
end

function mprod(sv::Sphere, sw::Sphere)
  v = sv.vec
  w = sw.vec
  v[1]*w[2] + v[2]*w[1] - dot(v[3:end], w[3:end])
end

point(pt::Vector{<:Number}, ctx::Construction) =
  Sphere([one(eltype(pt)), dot(pt, pt), pt...], ctx)

end