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