anchor.diff:  // TODO: 3D: remove any incidental allocation.
   // TODO: 3D: make sure to use proper collection comparer for string keys.
   // TODO: 3D: make sure to use TryAdd in the appropriate places.
  +// TODO: 3D: abstract ArchetypeId.
   
   /// Allows a value to always pass as equal with another of its same type.
   type [<CustomEquality; NoComparison>] 'a AlwaysEqual =
  
positive.code:             let state = this.Publish<EcsRegistrationData, obj> (EcsEvents.Unregistering termName) eventData (state :> obj) :?> 's
              archetype.Unregister archetypeSlot.ArchetypeIndex
              archetypeSlots.Remove entityRef.EntityId |> ignore<bool>
              let archetypeId = { Terms = Dictionary<_, _> archetype.Id.Terms }
              archetypeId.Terms.Remove termName |> ignore<bool>
              if archetypeId.Terms.Count > 0 then
                  let archetypeIndex = archetype.Register comps
  
negative.code:             let eventData = { EntityRef = entityRef; ContextName = termName }
              this.Publish<EcsRegistrationData, obj> (EcsEvents.Register termName) eventData (state :> obj) :?> 's
          | (false, _) ->
              let archetypeId = ArchetypeId.make (Dictionary.singleton HashIdentity.Structural termName term)
              let comps = dictPlus HashIdentity.Structural [] // TODO: use cached empty dictionary.
              match term with Extra (compName, _, comp) -> comps.Add (compName, comp.AlwaysEqualValue) | _ -> ()
              let state =
  