Sarcasm.Unparsing.FormatterExtensions.FilterInsertedUtokens C# (CSharp) Method

FilterInsertedUtokens() public static method

public static FilterInsertedUtokens ( this utokens, IPostProcessHelper postProcessHelper ) : IEnumerable
utokens this
postProcessHelper IPostProcessHelper
return IEnumerable
        public static IEnumerable<UtokenBase> FilterInsertedUtokens(this IEnumerable<UtokenBase> utokens, IPostProcessHelper postProcessHelper)
        {
            InsertedUtokens prevInsertedUtokensToBeYield = null;
            var nonOverridableSkipThroughBuffer = new Queue<UtokenBase>();

            foreach (UtokenBase utoken in utokens.Concat((UtokenBase)null))
            {
                if (utoken is InsertedUtokens)
                {
                    InsertedUtokens nextInsertedUtokens = (InsertedUtokens)utoken;

                    var switchToNextInsertedUtokens = new Lazy<bool>(() => IsNextStronger(prevInsertedUtokensToBeYield, nextInsertedUtokens, postProcessHelper.Direction));

                    if (nextInsertedUtokens.Behavior == Behavior.Overridable)
                    {
                        prevInsertedUtokensToBeYield = switchToNextInsertedUtokens.Value ? nextInsertedUtokens : prevInsertedUtokensToBeYield;
                    }
                    else if (nextInsertedUtokens.Behavior == Behavior.NonOverridableSkipThrough)
                    {
                        if (postProcessHelper.Direction == Unparser.Direction.LeftToRight)
                            yield return nextInsertedUtokens;
                        else
                            nonOverridableSkipThroughBuffer.Enqueue(nextInsertedUtokens);
                    }
                    else if (nextInsertedUtokens.Behavior == Behavior.NonOverridableSeparator)
                    {
                        if (!switchToNextInsertedUtokens.Value)
                            yield return prevInsertedUtokensToBeYield;

                        while (nonOverridableSkipThroughBuffer.Count > 0)
                            yield return nonOverridableSkipThroughBuffer.Dequeue();

                        yield return nextInsertedUtokens;
                        prevInsertedUtokensToBeYield = null;
                    }
                }
                else if (utoken is UtokenControl && ((UtokenControl)utoken).IsIndent())
                {
                    // handle it as it were a NonOverridableSkipThrough
                    if (postProcessHelper.Direction == Unparser.Direction.LeftToRight)
                        yield return utoken;
                    else
                        nonOverridableSkipThroughBuffer.Enqueue(utoken);
                }
                else
                {
                    if (prevInsertedUtokensToBeYield != null)
                    {
                        yield return prevInsertedUtokensToBeYield;
                        prevInsertedUtokensToBeYield = null;
                    }

                    while (nonOverridableSkipThroughBuffer.Count > 0)
                        yield return nonOverridableSkipThroughBuffer.Dequeue();

                    if (utoken != null)
                        yield return utoken;
                }
            }
        }