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;
}
}
}