internal GreenModel RemoveObject(ObjectId oid) { Debug.Assert(!this.lazyProperties.ContainsKey(oid)); ImmutableDictionary <ObjectId, GreenObject> objects = this.objects; ImmutableDictionary <ObjectId, ImmutableHashSet <Slot> > refs; if (this.references.TryGetValue(oid, out refs)) { foreach (var refEntry in refs) { GreenObject green; if (this.objects.TryGetValue(refEntry.Key, out green)) { GreenObject oldGreen = green; foreach (var slot in refEntry.Value) { object value; if (green.Slots.TryGetValue(slot, out value)) { if (value is GreenList) { GreenList list = (GreenList)value; green = green.Update( green.Parent == oid ? null : green.Parent, green.Children.RemoveAll(item => item == oid), green.Slots.SetItem(slot, list.RemoveAll(oid))); } else if ((ObjectId)value == oid) { green = green.Update( green.Parent == oid ? null : green.Parent, green.Children.RemoveAll(item => item == oid), green.Slots.SetItem(slot, GreenObject.Unassigned)); } } } if (green != oldGreen) { objects.SetItem(refEntry.Key, green); } } } return(this.Update( this.name, this.version, objects.Remove(oid), this.strongObjects.Remove(oid), this.lazyProperties.Remove(oid), this.references.Remove(oid))); } return(this); }
internal GreenModel ReplaceObject(ObjectId oid, ObjectId targetOid) { Debug.Assert(!this.lazyProperties.ContainsKey(oid)); ImmutableDictionary <ObjectId, GreenObject> objects = this.objects; ImmutableDictionary <ObjectId, ImmutableHashSet <Slot> > refs; if (this.references.TryGetValue(oid, out refs)) { ImmutableDictionary <ObjectId, ImmutableHashSet <Slot> > targetRefs; if (!this.references.TryGetValue(targetOid, out targetRefs)) { targetRefs = ImmutableDictionary <ObjectId, ImmutableHashSet <Slot> > .Empty; } foreach (var refEntry in refs) { GreenObject green; if (this.objects.TryGetValue(refEntry.Key, out green)) { GreenObject oldGreen = green; ImmutableHashSet <Slot> targetSlots; if (!targetRefs.TryGetValue(refEntry.Key, out targetSlots)) { targetSlots = ImmutableHashSet <Slot> .Empty; } foreach (var slot in refEntry.Value) { object value; if (green.Slots.TryGetValue(slot, out value)) { if (value is GreenList) { GreenList list = (GreenList)value; green = green.Update( green.Parent == oid ? targetOid : green.Parent, green.Children.Replace(oid, targetOid), green.Slots.SetItem(slot, list.Replace(oid, targetOid))); targetSlots = targetSlots.Add(slot); } else if ((ObjectId)value == oid) { green = green.Update( green.Parent == oid ? targetOid : green.Parent, green.Children.Replace(oid, targetOid), green.Slots.SetItem(slot, targetOid)); targetSlots = targetSlots.Add(slot); } } } if (green != oldGreen) { objects.SetItem(refEntry.Key, green); } if (targetSlots.Count > 0) { targetRefs = targetRefs.SetItem(refEntry.Key, targetSlots); } } } return(this.Update( this.name, this.version, objects.Remove(oid), this.strongObjects.Remove(oid), this.lazyProperties.Remove(oid), targetRefs.Count > 0 ? this.references.Remove(oid).SetItem(targetOid, targetRefs) : this.references.Remove(oid))); } return(this); }