/// <summary>
 /// Sets interval manager of chain.
 /// </summary>
 /// <param name="manager">
 /// The manager.
 /// </param>
 public void SetIntervalManager(CongenericIntervalsManager manager)
 {
     intervalsManager = manager;
 }
        /// <summary>
        /// Sets item in provided position.
        /// </summary>
        /// <param name="index">
        /// The index.
        /// </param>
        public void Set(int index)
        {
            if (index >= length || index < 0)
            {
                throw new ArgumentOutOfRangeException("Index of added element is out of bounds (index = " + index + ", chain length = " + length + ").");
            }

            intervalsManager = null;

            if (!positions.Contains(index))
            {
                positions.Add(index);
                positions = positions.OrderBy(b => b).ToList();
            }
        }
 /// <summary>
 /// Removes element from given position.
 /// Also clears interval manager of chain.
 /// </summary>
 /// <param name="index">
 /// Index of position.
 /// </param>
 public override void RemoveAt(int index)
 {
     intervalsManager = null;
     positions.Remove(index);
 }
        /// <summary>
        /// Returns clone of intervals array including interval of given link.
        /// </summary>
        /// <param name="link">
        /// The link.
        /// </param>
        /// <returns>
        /// The <see cref="T:List{int}"/>.
        /// </returns>
        public int[] GetIntervals(Link link)
        {
            if (intervalsManager == null)
            {
                intervalsManager = positions.Count != 0 ? (ICongenericIntervalsManager)new CongenericIntervalsManager(this) : new NullCongenericIntervalsManager();
            }

            return intervalsManager.GetIntervals(link);
        }
        /// <summary>
        /// Deletes given position.
        /// Clears element from position if any.
        /// Reduces chain length by 1.
        /// The delete at.
        /// </summary>
        /// <param name="index">
        /// The index of position.
        /// </param>
        public override void DeleteAt(int index)
        {
            intervalsManager = null;
            length--;
            if (positions.Contains(index))
            {
                positions.Remove(index);
            }

            for (int i = 0; i < positions.Count; i++)
            {
                if (index < positions[i])
                {
                    positions[i]--;
                }
            }
        }
        /// <summary>
        /// Deletes chain (building and alphabet) and creates new empty chain with given length.
        /// Saves old element (alphabet) of chain.
        /// </summary>
        /// <param name="newLength">
        /// New chain length.
        /// </param>
        /// <exception cref="ArgumentException">
        /// Thrown if new length is less than 0.
        /// </exception>
        public override void ClearAndSetNewLength(int newLength)
        {
            if (newLength < 0)
            {
                throw new ArgumentException("Chain length shouldn't be less than 0.");
            }

            intervalsManager = null;
            length = newLength;
            positions = new List<int>();
        }