public static Tuple <Trace, Trace> TransformTrace( PairTransform <TraceElement> transform, IEnumerable <Predicate <TraceElement> > predicates1, IEnumerable <Predicate <TraceElement> > predicates2) { var transformed = Extensions.ReplaceSubsequences(Trace1, Trace2, transform, predicates1, predicates2); return(new Tuple <Trace, Trace>(new Trace(transformed.Item1), new Trace(transformed.Item2))); }
public static Tuple <IList <T>, IList <T> > ReplaceSubsequences <T>( IEnumerable <T> sequence1, IEnumerable <T> sequence2, PairTransform <T> transform, IEnumerable <Predicate <T> > predicates1, IEnumerable <Predicate <T> > predicates2) { var result1 = new List <T>(); var result2 = new List <T>(); IEnumerable <T> current1 = sequence1; IEnumerable <T> current2 = sequence2; while (predicates1.Any() && current1.Any() && predicates2.Any() && current2.Any()) { current1 = current1.TakeMatch( (scanned1, ts1) => current2 = current2.TakeMatch( (scanned2, ts2) => { var transformed = transform(ts1, ts2); result1.AddRange(scanned1); result1.AddRange(transformed.Item1); result2.AddRange(scanned2); result2.AddRange(transformed.Item2); }, scanned2 => { result1.AddRange(scanned1); result1.AddRange(ts1); result2.AddRange(scanned2); }, predicates2), scanned1 => result1.AddRange(scanned1), predicates1); } result1.AddRange(current1); result2.AddRange(current2); return(new Tuple <IList <T>, IList <T> >(result1, result2)); }