Spring – Rev 1

Subversion Repositories:
Rev:
using System;
using System.Collections.Generic;

namespace Spring.Utilities.Collections
{
    public class Ring<T>
    {
#region Public Enums, Properties and Fields

        public int Count { get; }

#endregion

#region Private Delegates, Events, Enums, Properties, Indexers and Fields

        private LinkedListNode<T> Current { get; set; }

        private LinkedList<T> List { get; }

#endregion

#region Constructors, Destructors and Finalizers

        public Ring(IEnumerable<T> e)
        {
            List = new LinkedList<T>(e);

            Count = List.Count;
            Current = List.First;
        }

#endregion

#region Public Methods

        public void Get(out T element)
        {
            if (Current == null)
            {
                element = default;

                return;
            }

            element = Current.Value;

            Current = Current.Next ?? Current.List.First;
        }

        public T SeekReverseUntil(Func<T, bool> condition)
        {
            if (Current == null)
            {
                return default;
            }

            var element = Current.Previous;

            if (element == null)
            {
                return default;
            }

            do
            {
                element = element.Previous;

                if (element == null)
                {
                    return default;
                }

                if (condition.Invoke(element.Value))
                {
                    return element.Value;
                }
            } while (element != Current);

            return default;
        }

#endregion
    }
}