Tuple<List<Cairo.Rectangle>, List<Cairo.Rectangle>> GetDiffPaths (List<Hunk> diff, MonoTextEditor editor, Hunk hunk)
{
if (!diffCache.ContainsKey (diff))
diffCache[diff] = new Dictionary<Hunk, Tuple<List<Cairo.Rectangle>, List<Cairo.Rectangle>>> ();
var pathCache = diffCache[diff];
Tuple<List<Cairo.Rectangle>, List<Cairo.Rectangle>> result;
if (pathCache.TryGetValue (hunk, out result))
return result;
var words = BreakTextInWords (editor, hunk.RemoveStart, hunk.Removed);
var cmpWords = BreakTextInWords (MainEditor, hunk.InsertStart, hunk.Inserted);
var wordDiff = new List<Hunk> (Diff.GetDiff (words.Select (w => editor.GetTextAt (w)).ToArray (),
cmpWords.Select (w => MainEditor.GetTextAt (w)).ToArray ()));
result = Tuple.Create (CalculateChunkPath (editor, wordDiff, words, true),
CalculateChunkPath (MainEditor, wordDiff, cmpWords, false));
pathCache[hunk] = result;
return result;
}