public void It_Should_Find_Elements_In_Its_Array()
        {
            // Arrange
            var cycleTag = new CycleTag();
            cycleTag.CycleList.Add(new TreeNode<LiquidExpression>(new LiquidExpression { Expression = new StringValue("A")}));
            cycleTag.CycleList.Add(new TreeNode<LiquidExpression>(new LiquidExpression { Expression = new StringValue("B") }));
            cycleTag.CycleList.Add(new TreeNode<LiquidExpression>(new LiquidExpression { Expression = new StringValue("C") }));

            // Assert
            Assert.That(((StringValue) cycleTag.ElementAt(0).Data.Expression).StringVal, Is.EqualTo("A"));
            Assert.That(((StringValue) cycleTag.ElementAt(1).Data.Expression).StringVal, Is.EqualTo("B"));
      }
        /// <summary>
        /// Side effect: state is managed in the _counters dictionary.
        /// </summary>
        /// <returns></returns>
        private String GetNextCycleText(String groupName, CycleTag cycleTag)
        {

            int currentIndex;
            // Create a like dictionary key entry to keep track of this declaration.  THis takes the variable
            // names (not the eval-ed variables) or literals and concatenates them together.
            var key = "cycle_" + groupName + "_" + String.Join("|", cycleTag.CycleList.Select(x => x.Data.Expression.ToString()));
            

            while (true)
            {
                currentIndex = _counters.GetOrAdd(key, 0);
                var newindex = (currentIndex + 1) % cycleTag.Length;

                // fails if updated concurrently by someone else.
                if (_counters.TryUpdate(key, newindex, currentIndex))
                {
                    break;
                }
            }

            String result = "";
            var currentElement = cycleTag.ElementAt(currentIndex);
            LiquidExpressionEvaluator.Eval(currentElement, _templateContext)
                .WhenSuccess(x => result = ValueCaster.RenderAsString(LiquidExpressionEvaluator.Eval(currentElement, _templateContext).SuccessResult.Value))
                .WhenError(err => result = FormatErrors(new List<LiquidError> {err}));

            return result;

        }
 public void Visit(CycleTag cycleTag)
 {
     _result += cycleTag.ToString();
 }
        public void Visit(CycleTag cycleTag)
        {
            String groupName = null;
            if (cycleTag.GroupNameExpressionTree != null)
            {
                LiquidError error = null;
                // figure out the group name if any, otherwise use null.
                LiquidExpressionEvaluator.Eval(cycleTag.GroupNameExpressionTree, _templateContext)
                    .WhenSuccess(x => groupName = x.HasValue ? ValueCaster.RenderAsString(x.Value) : null)
                    .WhenError(x => error = x);
                if (error!=null)
                {
                    RenderError(error);
                    return;
                } 

            }
            AppendTextToCurrentAccumulator(GetNextCycleText(groupName, cycleTag));
        }