Ejemplo n.º 1
0
        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)));
        }
Ejemplo n.º 2
0
        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));
        }