public void Parse(Stream stream, Action <BracketPipeTextFragment> callback)
        {
            bool skip = false;

            if (Distinct)
            {
                cache = new FastLookupCache <string>(CacheSize);
            }
            else
            {
                cache = null;
            }

            var filter = GetFilter(Filter);

            if (filter == null)
            {
                throw new FetchoException("{0} is an invalid filter type", Filter);
            }

            var tag = new Stack <string>();

            using (var reader = new HtmlReader(stream))
            {
                foreach (var c in reader)
                {
                    switch (c.Type)
                    {
                    case HtmlTokenType.StartTag:
                        if (c.Value == ScriptHtmlTag)
                        {
                            skip = true;
                        }
                        if (c.Value == StyleHtmlTag)
                        {
                            skip = true;
                        }
                        tag.Push(c.Value);
                        break;

                    case HtmlTokenType.EndTag:
                        if (c.Value == ScriptHtmlTag)
                        {
                            skip = false;
                        }
                        if (c.Value == StyleHtmlTag)
                        {
                            skip = false;
                        }
                        if (tag.Count > 0)
                        {
                            tag.Pop();
                        }
                        break;

                    default:
                        break;
                    }

                    if (!skip && c.Type == HtmlTokenType.Text)
                    {
                        if (c.Value.Length.IsBetween(MinimumLength, MaximumLength))
                        {
                            if (cache == null || !cache.Contains(c.Value))
                            {
                                cache?.Enqueue(c.Value);
                                string tagvalue = string.Empty;
                                if (tag.Count > 0)
                                {
                                    tagvalue = tag.Peek();
                                }
                                var fragment = new BracketPipeTextFragment(tagvalue, c.Value);
                                if (filter(fragment))
                                {
                                    callback(fragment);
                                }
                            }
                        }
                    }
                }
            }
        }
 private bool GenericTagFilter(string[] validTags, BracketPipeTextFragment fragment)
 => validTags.Any(x => x == fragment.Tag);