Exemplo n.º 1
0
        protected Tuple <Hunk <T>, Hunk <T>, Hunk <T> > BasicShakerFunction(
            Hunk <T> target,
            ShakeCondition <T> cond,
            ShakeSelector <T> selector)
        {
#if DEBUG
            Console.WriteLine("target = [{0}, {1}], {2}", target.Start, target.Length, target.Value);
#endif
            Func <Segment, Hunk <T>, int> getRest = (seg, hunk) => (hunk.Length - (seg.Start + seg.Length));
#if DEBUG
            Func <Segment, Hunk <T>, int> getComputedHunkStart = (seg, hunk) => seg.Start + hunk.Start;
#endif
            Func <Segment, int> getComputedStart = (seg) => seg.Start + seg.Length;
            Segment             result           = cond(target);
            if (result == null)
            {
#if DEBUG
                Console.WriteLine("Done Null");
#endif
                return(new Tuple <Hunk <T>, Hunk <T>, Hunk <T> >(null, null, target));
            }
            else
            {
#if DEBUG
                Console.WriteLine("Target = {0}", target);
                Console.WriteLine("Target.Length = {0}", target.Length);
                Console.WriteLine("Result = {0}", result);
                Console.WriteLine("Result Substring = {0}", result.Substring(target.Value.ToString()));
                Console.WriteLine("Result = {0}", result);
#endif
                Segment restSection = new Segment(getRest(result, target), getComputedStart(result));
#if DEBUG
                Console.WriteLine("restSection = {0}", restSection);
                Console.WriteLine("restSection = {0}", restSection);
                Console.WriteLine("Calling selector");
#endif
                var matchHunks = selector(result, target);
#if DEBUG
                Console.WriteLine("Finished Calling Selector");
#endif
                var before = matchHunks.Item1;
                var match  = matchHunks.Item2;
                match.IsBig = false; //make sure this is preserved
                var restHunks = selector(restSection, target);
                var rest      = restHunks.Item2;
                rest.IsBig = true;
                return(new Tuple <Hunk <T>, Hunk <T>, Hunk <T> >(before, match, rest));
            }
        }