filediff 1.0.0.2 → 1.0.0.3
raw patch · 2 files changed
+22/−22 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- filediff.cabal +1/−1
- src/Filediff.hs +21/−21
filediff.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: filediff-version: 1.0.0.2+version: 1.0.0.3 synopsis: Diffing and patching module description: `filediff` is a Haskell library for creating diffs, and applying diffs to files and directories. homepage: https://github.com/bgwines/filediff
src/Filediff.hs view
@@ -262,11 +262,13 @@ -- all functions below are not exposed -- don't hit the memotable if not necessary-longestCommonSubsequenceWrapper :: forall a. (MemoTable a, Eq a) => [a] -> [a] -> [a]+longestCommonSubsequenceWrapper :: forall a. (Eq a) => [a] -> [a] -> [a] longestCommonSubsequenceWrapper xs ys = if xs == ys then xs -- (WLOG) don't want to return xs ++ xs- else commonPrefix ++ longestCommonSubsequence xs' ys' ++ commonSuffix+ else commonPrefix+ ++ longestCommonSubsequence (getMiddle xs) (getMiddle ys)+ ++ commonSuffix where commonPrefix :: [a] commonPrefix = getCommonPrefix xs ys@@ -280,39 +282,37 @@ getMiddle :: [a] -> [a] getMiddle elems = take (length elems - length commonPrefix - length commonSuffix) . drop (length commonPrefix) $ elems - xs' :: [a]- xs' = getMiddle xs-- ys' :: [a]- ys' = getMiddle ys+-- | Compute the longest common (potentially noncontiguous) subsequence+-- between two sequences. Element type is fixed because memoization+-- requires a static type.+longestCommonSubsequence :: forall a. (Eq a) => [a] -> [a] -> [a]+longestCommonSubsequence xs ys = longestCommonSubsequence' xs ys 0 0 -- optimization: hash lines -- | Compute the longest common (potentially noncontiguous) subsequence -- between two sequences. Element type is fixed because memoization -- requires a static type.-longestCommonSubsequence :: forall a. (MemoTable a, Eq a) =>- [a] -> [a] -> [a]-longestCommonSubsequence- = Memo.memo2- (Memo.list table)- (Memo.list table)- longestCommonSubsequence'+longestCommonSubsequence' :: forall a. (Eq a) =>+ [a] -> [a] -> Int -> Int -> [a]+longestCommonSubsequence' xs ys i j+ = (Memo.memo2 Memo.integral Memo.integral+ (longestCommonSubsequence'' xs ys)) i j where- longestCommonSubsequence' :: [a] -> [a] -> [a]- longestCommonSubsequence' [] _ = []- longestCommonSubsequence' _ [] = []- longestCommonSubsequence' (x:xs) (y:ys) =+ longestCommonSubsequence'' :: [a] -> [a] -> Int -> Int -> [a]+ longestCommonSubsequence'' [] _ _ _ = []+ longestCommonSubsequence'' _ [] _ _ = []+ longestCommonSubsequence'' (x:xs) (y:ys) i j = if x == y- then x : (longestCommonSubsequence xs ys) -- WLOG+ then x : (longestCommonSubsequence' xs ys (i + 1) (j + 1)) -- WLOG else if (length caseX) > (length caseY) then caseX else caseY where caseX :: [a]- caseX = longestCommonSubsequence xs (y:ys)+ caseX = longestCommonSubsequence' xs (y:ys) (i+1) j caseY :: [a]- caseY = longestCommonSubsequence (x:xs) ys+ caseY = longestCommonSubsequence' (x:xs) ys i (j+1) -- | When `sub` is a (not necessarily contiguous) subsequence of `super`, -- get the index at which each element of `sub` appears. E.g.