/// <summary>This constructor is called when a CoordinablePhraseBuilder transforms itself into a CoordinatedPhraseBuilder during Coordinate.</summary>
        /// <remarks>This implementation creates a CoordinatedPhraseBuilder that contains only coordinated elements and optionally a coordinating word.  Subclasses may need
        /// to override with implementations that bring in additional syntax elements.<para>The argument <paramref name="childOrderings"/> may contain ChildOrderings
        /// referring to elements that are not coordinated elements or a coordinator.  We remove those orderings here.</para></remarks>
        internal CoordinatedPhraseBuilder(phraseCategory category, IEnumerable <IElementTreeNode> coordinated, ConjunctionBuilder coordinator, HashSet <ChildOrdering> childOrderings) : base()
        {
            Phrase = new CoordinatedPhraseElement(category);
            SetCoordinatedElements(coordinated);
            SetCoordinator(coordinator);
            ChildOrderings = childOrderings;
            HashSet <IElementTreeNode> childrenInOrderingsThatHaveNotBeenMovedYet = new HashSet <IElementTreeNode>();

            foreach (ChildOrdering ordering in ChildOrderings)
            {
                if (!Children.Contains(ordering.Before))
                {
                    childrenInOrderingsThatHaveNotBeenMovedYet.Add(ordering.Before);
                }
                if (!Children.Contains(ordering.After))
                {
                    childrenInOrderingsThatHaveNotBeenMovedYet.Add(ordering.After);
                }
            }
            foreach (IElementTreeNode missingChild in childrenInOrderingsThatHaveNotBeenMovedYet)
            {
                RemoveChildOrderingsThatReferTo(missingChild);
            }
        }
 public CoordinatedPhraseElement(phraseCategory category) => Category = category;
 private CoordinatedPhraseBuilder(phraseCategory category) : base()
 {
     Phrase = new CoordinatedPhraseElement(category);
 }