module Language.ECMAScript3.SourceDiff where
import Data.Algorithm.Diff
import Language.ECMAScript3.Syntax
import Language.ECMAScript3.PrettyPrint
import Data.List (intersperse)
jsDiff :: JavaScript a -> JavaScript a -> String
jsDiff js1 js2 =
let plines = lines . show . prettyPrint
diff = getGroupedDiff (plines js1) (plines js2)
formatDiff :: Diff [String] -> String
formatDiff d = let (prefix, strs) = case d of
First ss -> ('-', ss)
Second ss -> ('+', ss)
Both ss _ -> (' ', ss)
in concat $ intersperse "\n" $ map (prefix:) strs
in concat $ intersperse "\n" $ map formatDiff diff