transform = (matrix, ...objects) => {
  // TODO how to check that the matrix is REAL?

  objects = flatten(objects)
  if (objects.length === 0) throw new Error('wrong number of arguments')

  const results = objects.map((object) => {
    if (path2.isA(object)) return path2.transform(matrix, object)
    if (geom2.isA(object)) return geom2.transform(matrix, object)
    if (geom3.isA(object)) return geom3.transform(matrix, object)
    return object
  })
  return results.length === 1 ? results[0] : results
}
Transform the given objects using the given matrix.
@param {mat4} matrix - a transformation matrix
@param {...Object} objects - the objects to transform
@return {Object|Array} the transformed object, or a list of transformed objects
@alias module:modeling/transforms.transform

@example
const newsphere = transform(mat4.rotateX(TAU / 8), sphere())