Ejemplo 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));
            }
        }
Ejemplo n.º 2
0
        public IEnumerable <Hunk <T> > Shake(Hunk <T> target, ShakeCondition <T> cond, ShakeSelector <T> selector)
        {
            Hunk <T> prev = target;
            Tuple <Hunk <T>, Hunk <T>, Hunk <T> > curr = new Tuple <Hunk <T>, Hunk <T>, Hunk <T> >(null, null, target);

            do
            {
                //need a way to just say "if you don't find a single thing
                // then just kick back"
                curr = BasicShakerFunction(curr.Item3, cond, selector);
                if (curr.Item1 != null)
                {
                    yield return(curr.Item1);
                }
                if (curr.Item2 != null)
                {
                    yield return(curr.Item2);
                }
                if (curr.Item3.Equals(prev))
                {
                    if (curr.Item3.Length > 0)
                    {
                        yield return(curr.Item3);
                    }
                    yield break;
                }
                prev = curr.Item3;
            } while (true);
        }
Ejemplo n.º 3
0
 public ShakerContainer(ShakeSelector <T> selector)
 {
     Selector = selector;
 }