-- | Simple textual diffing of JavaScript programs for inspecting test
-- failures
module Language.ECMAScript3.SourceDiff where

import Data.Algorithm.Diff
import Data.Algorithm.DiffOutput
import Language.ECMAScript3.Syntax
import Language.ECMAScript3.PrettyPrint
import Data.List (intersperse, intercalate)

jsDiff :: JavaScript a -> JavaScript a -> String
jsDiff :: JavaScript a -> JavaScript a -> String
jsDiff JavaScript a
js1 JavaScript a
js2 = 
  let plines :: JavaScript a -> [String]
plines = String -> [String]
lines (String -> [String])
-> (JavaScript a -> String) -> JavaScript a -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> String
forall a. Show a => a -> String
show (Doc -> String) -> (JavaScript a -> Doc) -> JavaScript a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaScript a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint
      diff :: [Diff [String]]
diff = [String] -> [String] -> [Diff [String]]
forall a. Eq a => [a] -> [a] -> [Diff [a]]
getGroupedDiff (JavaScript a -> [String]
plines JavaScript a
js1) (JavaScript a -> [String]
plines JavaScript a
js2)
  in [Diff [String]] -> String
ppDiff [Diff [String]]
diff