/// <summary>
        ///   Clears an items reversibly.
        /// </summary>
        /// <typeparam name = "T">Type of ICollection</typeparam>
        /// <param name = "collection">Collection to clear</param>
        public static void Clear_Reversible <T>(this ICollection <T> collection)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                txn.AddEdit(new ICollectionClearEdit <T>(collection));
            }
            collection.Clear();
        }
        /// <summary>
        ///   Adds an item reversible
        /// </summary>
        /// <typeparam name = "T">Type of item to add</typeparam>
        /// <param name = "collection">Collection to add item to</param>
        /// <param name = "itemToAdd">Item to add</param>
        public static void Add_Reversible <T>(this ICollection <T> collection, T itemToAdd)
        {
            collection.Add(itemToAdd);
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                txn.AddEdit(new ICollectionEdit <T>(ICollectionEditAction.AddItem, collection, itemToAdd));
            }
        }
        /// <summary>
        ///   Removes an item reversibly.
        /// </summary>
        /// <typeparam name = "T">Type of item to add</typeparam>
        /// <param name = "collection">Collection to remove from</param>
        /// <param name = "itemToRemove">Item to remove</param>
        public static bool Remove_Reversible <T>(this ICollection <T> collection, T itemToRemove)
        {
            bool        retValue = collection.Remove(itemToRemove);
            Transaction txn      = Transaction.Current;

            if (txn != null)
            {
                txn.AddEdit(new ICollectionEdit <T>(ICollectionEditAction.RemoveItem, collection, itemToRemove));
            }
            return(retValue);
        }
        /// <summary>
        ///   Inserts an item reversibly.
        /// </summary>
        /// <typeparam name = "T">Type of list</typeparam>
        /// <param name = "list">List to insert in</param>
        /// <param name = "index">Index to insert at</param>
        /// <param name = "itemToInsert">Item to insert</param>
        public static void Insert_Reversible <T>(this IList <T> list, int index, T itemToInsert)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                list.Insert(index, itemToInsert);
                txn.AddEdit(new IListEdit <T>(ListEditAction.AddItem, list, itemToInsert, index));
            }
            else
            {
                list.Insert(index, itemToInsert);
            }
        }
        /// <summary>
        ///   Inserts a set of items at a given position in a list (reversibly).
        /// </summary>
        /// <param name = "index"></param>
        /// <param name = "collection"></param>
        public static void InsertRange_Reversible <T>(this List <T> list, int index, IEnumerable <T> collection)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                List <T> itemsToInsert = new List <T>(collection);
                list.InsertRange(index, itemsToInsert);
                txn.AddEdit(new ListRangeEdit <T>(ListEditAction.AddItem, list, itemsToInsert, index));
            }
            else
            {
                list.InsertRange(index, collection);
            }
        }
        /// <summary>
        ///   Sorts a subset of the list (reversible).
        /// </summary>
        /// <param name = "index">Index of first item to sort</param>
        /// <param name = "count">Count of items to sort</param>
        /// <param name = "comparer">Comparer to use to sort.</param>
        public static void Sort_Reversible <T>(this List <T> list, int index, int count, IComparer <T> comparer)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                List <T> changedItems = list.GetRange(index, count);
                list.Sort(index, count, comparer);
                txn.AddEdit(new ListRangeEdit <T>(ListEditAction.ChangeItem, list, changedItems, index));
            }
            else
            {
                list.Sort(index, count, comparer);
            }
        }
        /// <summary>
        ///   Sorts the list using a given Comparison (reversible)
        /// </summary>
        /// <param name = "comparison">Comparision delegate to use.</param>
        public static void Sort_Reversible <T>(this List <T> list, Comparison <T> comparison)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                List <T> changedItems = list.GetRange(0, list.Count);
                list.Sort(comparison);
                txn.AddEdit(new ListRangeEdit <T>(ListEditAction.ChangeItem, list, changedItems, 0));
            }
            else
            {
                list.Sort(comparison);
            }
        }
        /// <summary>
        ///   Removes a range of items in a list (reversibly).
        /// </summary>
        /// <param name = "index">Index of first item to remove</param>
        /// <param name = "count">Count of items to remove.</param>
        public static void RemoveRange_Reversible <T>(this List <T> list, int index, int count)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                List <T> removedItems = list.GetRange(index, count);
                list.RemoveRange(index, count);
                txn.AddEdit(new ListRangeEdit <T>(ListEditAction.RemoveItem, list, removedItems, index));
            }
            else
            {
                list.RemoveRange(index, count);
            }
        }
        /// <summary>
        ///   Sets a list item reversibly.
        /// </summary>
        /// <typeparam name = "T">Type of list</typeparam>
        /// <param name = "list">List to set item in</param>
        /// <param name = "index">Index of item to set</param>
        /// <param name = "newValue">New value to assign.</param>
        public static void Item_SetReversible <T>(this IList <T> list, int index, T newValue)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                T oldValue = list[index];
                list[index] = newValue;
                txn.AddEdit(new IListEdit <T>(ListEditAction.ChangeItem, list, oldValue, index));
            }
            else
            {
                list[index] = newValue;
            }
        }
        /// <summary>
        ///   Removes an item reversibly.
        /// </summary>
        /// <typeparam name = "T">Type of list</typeparam>
        /// <param name = "list">List to insert in</param>
        /// <param name = "index">Index to insert at</param>
        public static void RemoveAt_Reversible <T>(this IList <T> list, int index)
        {
            Transaction txn = Transaction.Current;

            if (txn != null)
            {
                T itemToRemove = list[index];
                list.RemoveAt(index);
                txn.AddEdit(new IListEdit <T>(ListEditAction.RemoveItem, list, itemToRemove, index));
            }
            else
            {
                list.RemoveAt(index);
            }
        }