summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Ziegler <austin@surfeasy.com>2013-01-20 20:28:19 -0500
committerAustin Ziegler <austin@surfeasy.com>2013-01-20 20:28:19 -0500
commit1e00ec3f95849c792f8399d348f3c385244ec7d9 (patch)
tree53534e7101f7c524373a8c7070c2c7126889d1b9
parent44be3864deaf16928bff7076b384fee240c400f6 (diff)
downloaddiff-lcs-1e00ec3f95849c792f8399d348f3c385244ec7d9.tar.gz
Extracting duplicated code to a private method.
-rw-r--r--lib/diff/lcs.rb47
-rw-r--r--lib/diff/lcs/callbacks.rb4
-rw-r--r--lib/diff/lcs/internals.rb28
3 files changed, 37 insertions, 42 deletions
diff --git a/lib/diff/lcs.rb b/lib/diff/lcs.rb
index 4017dba..d8b6f08 100644
--- a/lib/diff/lcs.rb
+++ b/lib/diff/lcs.rb
@@ -244,26 +244,8 @@ class << Diff::LCS
# initialise it. If the +callbacks+ object (possibly initialised) responds
# to #finish, it will be called.
def diff(seq1, seq2, callbacks = nil, &block) # :yields diff changes:
- callbacks ||= Diff::LCS::DiffCallbacks
- if callbacks.kind_of?(Class)
- cb = callbacks.new rescue callbacks
- callbacks = cb
- end
- traverse_sequences(seq1, seq2, callbacks)
- callbacks.finish if callbacks.respond_to?(:finish)
-
- if block_given?
- res = callbacks.diffs.map do |hunk|
- if hunk.kind_of?(Array)
- hunk = hunk.map { |hunk_block| yield hunk_block }
- else
- yield hunk
- end
- end
- res
- else
- callbacks.diffs
- end
+ diff_traversal(:diff, seq1, seq2, callbacks || Diff::LCS::DiffCallbacks,
+ &block)
end
# #sdiff computes all necessary components to show two sequences and their
@@ -281,26 +263,8 @@ class << Diff::LCS
# initialise it. If the +callbacks+ object (possibly initialised) responds
# to #finish, it will be called.
def sdiff(seq1, seq2, callbacks = nil, &block) #:yields diff changes:
- callbacks ||= Diff::LCS::SDiffCallbacks
- if callbacks.kind_of?(Class)
- cb = callbacks.new rescue callbacks
- callbacks = cb
- end
- traverse_balanced(seq1, seq2, callbacks)
- callbacks.finish if callbacks.respond_to?(:finish)
-
- if block_given?
- res = callbacks.diffs.map do |hunk|
- if hunk.kind_of?(Array)
- hunk = hunk.map { |hunk_block| yield hunk_block }
- else
- yield hunk
- end
- end
- res
- else
- callbacks.diffs
- end
+ diff_traversal(:sdiff, seq1, seq2, callbacks || Diff::LCS::SDiffCallbacks,
+ &block)
end
# #traverse_sequences is the most general facility provided by this
@@ -385,6 +349,7 @@ class << Diff::LCS
# sequence is reached, if +a+ has not yet reached the end of +A+ or +b+
# has not yet reached the end of +B+.
def traverse_sequences(seq1, seq2, callbacks = Diff::LCS::SequenceCallbacks, &block) #:yields change events:
+ callbacks ||= Diff::LCS::SequenceCallbacks
matches = Diff::LCS::Internals.lcs(seq1, seq2)
run_finished_a = run_finished_b = false
@@ -735,7 +700,7 @@ class << Diff::LCS
# Start with a new empty type of the source's class
res = src.class.new
- direction ||= Diff::LCS::Internals.diff_direction(src, patchset)
+ direction ||= Diff::LCS::Internals.intuit_diff_direction(src, patchset)
ai = bj = 0
diff --git a/lib/diff/lcs/callbacks.rb b/lib/diff/lcs/callbacks.rb
index c0658b6..8eec5fc 100644
--- a/lib/diff/lcs/callbacks.rb
+++ b/lib/diff/lcs/callbacks.rb
@@ -45,6 +45,10 @@ module Diff::LCS
#
# Diff::LCS.LCS(seq1, seq2, Diff::LCS::BalancedCallbacks)
BalancedCallbacks = DefaultCallbacks
+
+ def self.callbacks_for(callbacks)
+ callbacks.new rescue callbacks
+ end
end
# This will produce a compound array of simple diff change objects. Each
diff --git a/lib/diff/lcs/internals.rb b/lib/diff/lcs/internals.rb
index 31e7331..fe4ed9b 100644
--- a/lib/diff/lcs/internals.rb
+++ b/lib/diff/lcs/internals.rb
@@ -1,5 +1,31 @@
# -*- ruby encoding: utf-8 -*-
+class << Diff::LCS
+ def diff_traversal(method, seq1, seq2, callbacks, &block)
+ callbacks = callbacks_for(callbacks)
+ case method
+ when :diff
+ traverse_sequences(seq1, seq2, callbacks)
+ when :sdiff
+ traverse_balanced(seq1, seq2, callbacks)
+ end
+ callbacks.finish if callbacks.respond_to? :finish
+
+ if block
+ callbacks.diffs.map do |hunk|
+ if hunk.kind_of? Array
+ hunk.map { |hunk_block| block[hunk_block] }
+ else
+ block[hunk]
+ end
+ end
+ else
+ callbacks.diffs
+ end
+ end
+ private :diff_traversal
+end
+
module Diff::LCS::Internals # :nodoc:
end
@@ -117,7 +143,7 @@ class << Diff::LCS::Internals
# of one of the above.
#
# Note: This will be deprecated as a public function in a future release.
- def diff_direction(src, patchset, limit = nil)
+ def intuit_diff_direction(src, patchset, limit = nil)
string = src.kind_of?(String)
count = left_match = left_miss = right_match = right_miss = 0