message: avoid adding many identical single atom units in builder
diff: @@ -798,6 +798,9 @@ namespace Structure {
  private chainGroupId = -1;
  private inChainGroup = false;
  + private p = Vec3();
  + private singleElementUnits = new Map<string, Unit>();
  +
  beginChainGroup() {
  this.chainGroupId++;
  this.inChainGroup = true;
  @@ -811,14 +814,28 @@ namespace Structure {
  if (invariantId === undefined) invariantId = this.invariantId();
  const chainGroupId = this.inChainGroup ? this.chainGroupId : ++this.chainGroupId;
  const unit = Unit.create(this.units.length, invariantId, chainGroupId, traits, kind, model, operator, elements);
  + return this.add(unit);
  + }
  +
  + private add(unit: Unit) {
  + // this is to avoid adding many identical single atom units,
  + // for example, from 'degenerate' spacegroups
  + // - Diamond (COD 9008564)
  + if (unit.elements.length === 1) {
  + unit.conformation.position(unit.elements[0], this.p);
  + const hash = [unit.invariantId, this.p[0], this.p[1], this.p[2]].join('|');
  + if (this.singleElementUnits.has(hash)) {
  + return this.singleElementUnits.get(hash)!;
  + } else {
  + this.singleElementUnits.set(hash, unit);
  + }
  + }
  this.units.push(unit);
  return unit;
  }
  addWithOperator(unit: Unit, operator: SymmetryOperator): Unit {
  - const newUnit = unit.applyOperator(this.units.length, operator);
  - this.units.push(newUnit);
  - return newUnit;
  + return this.add(unit.applyOperator(this.units.length, operator));
  }
  getStructure(): Structure {
  