public static int IndexOfAny(this Rope<char> rope, char[] anyOf, int startIndex, int length)
{
if (rope == null)
throw new ArgumentNullException("rope");
if (anyOf == null)
throw new ArgumentNullException("anyOf");
rope.VerifyRange(startIndex, length);
while (length > 0)
{
var entry = rope.FindNodeUsingCache(startIndex).PeekOrDefault();
var contents = entry.node.contents;
var startWithinNode = startIndex - entry.nodeStartIndex;
var nodeLength = Math.Min(entry.node.length, startWithinNode + length);
for (var i = startIndex - entry.nodeStartIndex; i < nodeLength; i++)
{
var element = contents[i];
foreach (var needle in anyOf)
{
if (element == needle)
return entry.nodeStartIndex + i;
}
}
length -= nodeLength - startWithinNode;
startIndex = entry.nodeStartIndex + nodeLength;
}
return -1;
}