NodeIterator
The iterator through a collection of DOM nodes.
using AngleSharp.Extensions;
using System.Collections.Generic;
using System.Linq;
namespace AngleSharp.Dom.Collections
{
internal sealed class NodeIterator : INodeIterator
{
private readonly INode _root;
private readonly FilterSettings _settings;
private readonly NodeFilter _filter;
private readonly IEnumerable<INode> _iterator;
private INode _reference;
private bool _beforeNode;
public INode Root => _root;
public FilterSettings Settings => _settings;
public NodeFilter Filter => _filter;
public INode Reference => _reference;
public bool IsBeforeReference => _beforeNode;
public NodeIterator(INode root, FilterSettings settings, NodeFilter filter)
{
_root = root;
_settings = settings;
_filter = (filter ?? ((NodeFilter)((INode m) => FilterResult.Accept)));
_beforeNode = true;
_iterator = _root.GetElements<INode>(settings);
_reference = _iterator.First();
}
public INode Next()
{
INode node = _reference;
bool flag = _beforeNode;
do {
if (!flag)
node = _iterator.SkipWhile((INode m) => m != node).Skip(1).FirstOrDefault();
if (node == null)
return null;
flag = false;
} while (_filter(node) != FilterResult.Accept);
_beforeNode = false;
_reference = node;
return node;
}
public INode Previous()
{
INode node = _reference;
bool flag = _beforeNode;
do {
if (flag)
node = _iterator.TakeWhile((INode m) => m != node).LastOrDefault();
if (node == null)
return null;
flag = true;
} while (_filter(node) != FilterResult.Accept);
_beforeNode = true;
_reference = node;
return node;
}
}
}