public void AssignFrom(StackPlace place, ReferenceCapability referenceCapability)
        {
            if (place.Graph != Graph)
            {
                throw new ArgumentException("Must be part of the same graph", nameof(place));
            }

            switch (referenceCapability)
            {
            default:
                throw ExhaustiveMatch.Failed(referenceCapability);

            case ReferenceCapability.Owned:
            case ReferenceCapability.OwnedMutable:
            case ReferenceCapability.Isolated:
            case ReferenceCapability.IsolatedMutable:
            case ReferenceCapability.Held:
            case ReferenceCapability.HeldMutable:
                MoveFrom(place);
                break;

            case ReferenceCapability.Shared:
                ShareFrom(place);
                break;

            case ReferenceCapability.Borrowed:
                BorrowFrom(place);
                break;

            case ReferenceCapability.Identity:
                IdentityFrom(place);
                break;
            }
        }
        public void IdentityFrom(StackPlace place)
        {
            if (place.Graph != Graph)
            {
                throw new ArgumentException("Must be part of the same graph", nameof(place));
            }

            references.AddRange(place.References.Select(r => r.Identify()).DistinctBy(r => r.Referent));
            Graph.Dirty();
        }
        public void MoveFrom(StackPlace place)
        {
            if (place.Graph != Graph)
            {
                throw new ArgumentException("Must be part of the same graph", nameof(place));
            }

            references.AddRange(place.StealReferences());
            Graph.Dirty();
        }
        public void BorrowFrom(StackPlace place)
        {
            if (place.Graph != Graph)
            {
                throw new ArgumentException("Must be part of the same graph", nameof(place));
            }

            foreach (var reference in place.References)
            {
                references.Add(reference.Borrow());
            }
            Graph.Dirty();
        }
        private static void AppendStackItem(
            StringBuilder dot,
            StackPlace place,
            string nodeType,
            Dictionary <MemoryPlace, string> nodes,
            ref int nextNode)
        {
            var port = nodeType + nextNode;

            nodes.Add(place, "stack:" + port + ":e");
            var label = Escape(place.ToString() !);
            var color = "";

            if (!place.IsAllocated)
            {
                color = " COLOR=\"red\"";
                label = $"<S>{label}</S>";
            }
            dot.AppendLine($"            <TR><TD PORT=\"{port}\" ALIGN=\"LEFT\"{color}>{label}</TD></TR>");
            nextNode += 1;
        }