/// <summary> /// Given a sequence, applies each of our patterns over the sequence and returns /// all non overlapping matches for each of the patterns. /// </summary> /// <remarks> /// Given a sequence, applies each of our patterns over the sequence and returns /// all non overlapping matches for each of the patterns. /// Unlike #findAllNonOverlapping, overlapping matches from different patterns are kept. /// </remarks> /// <param name="elements">input sequence to match against</param> /// <returns>iterable of match results that are non-overlapping</returns> public virtual IEnumerable <ISequenceMatchResult <T> > FindAllNonOverlappingMatchesPerPattern <_T0>(IList <_T0> elements) where _T0 : T { ICollection <SequencePattern <T> > triggered = GetTriggeredPatterns(elements); IList <IEnumerable <ISequenceMatchResult <T> > > allMatches = new List <IEnumerable <ISequenceMatchResult <T> > >(elements.Count); foreach (SequencePattern <T> p in triggered) { SequenceMatcher <T> m = p.GetMatcher(elements); m.SetMatchWithResult(matchWithResult); IEnumerable <ISequenceMatchResult <T> > matches = m.FindAllNonOverlapping(); allMatches.Add(matches); } return(Iterables.Chain(allMatches)); }