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)); } }
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); }
public ShakerContainer(ShakeSelector <T> selector) { Selector = selector; }