Skip to content

Latest commit

 

History

History
70 lines (51 loc) · 2.37 KB

README.md

File metadata and controls

70 lines (51 loc) · 2.37 KB

Generate GDiff GADTs and Associated Instances

gdiff-th is a library for generating the necessary apparatus for preforming type safe diffs and patches with the gdiff library.

If you are unfamiliar with the gdiff library it can be found here http://hackage.haskell.org/package/gdiff

###Usage

First install the library from here or from cabal. #####With git git clone https://github.com/jfischoff/gdiff-th cd gdiff-th cabal install

#####With cabal cabal update cabal install gdiff-th

Below is a simple example of how to use the library to view a colored diff.

    module Example where
    import Data.Generic.Diff  
    import Data.Generic.Diff.TH  
    import System.Console.Terminfo.Color
    import Text.PrettyPrint.Free hiding (parens)
    import System.Console.Terminfo.PrettyPrint

    data Exp = Exp :+: Exp
             | Exp :*: Exp
             | B Integer
             deriving(Show, Eq, Typeable)

    -- Make the GDiff apparatus
    makeGDiff ''Exp

    testA :: Exp
    testA = foldl1 (:+:) . map B $ [0..20]

    testB :: Exp
    testB = foldl1 (:+:) . map B $ [0..8] ++ [42] ++ [10..20]

    -- Make a type signature to help inference
    diffExp :: Type ExpFamily Exp => Exp -> Exp -> EditScript ExpFamily Exp Exp
    diffExp = diff

    diffAandB = showCompressed $ diffExp testA testB  

    main = diffAandB

    -- Utility functions to show colored diffs
    showEdits :: forall (f :: * -> * -> *) txs tys.
                       EditScriptL f txs tys -> IO ()
    showEdits      = display . pprEdits 

    showCompressed :: Family f => EditScriptL f txs tys -> IO ()
    showCompressed = display . pprEdits . compress

    pprEdits :: EditScriptL f txs tys -> TermDoc
    pprEdits x = case x of 
        Cpy c d   -> (text $ string c) + pprEdits d
        CpyTree d -> text " ... "      + pprEdits d
        Del c d   -> (with (Foreground Red)   . text $ "- " ++ string c) + pprEdits d
        Ins c d   -> (with (Foreground Green) . text $ "+ " ++ string c) + pprEdits d
        End       -> line

Running the main function above would result in the following output

    :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: ... B + 42 - 9 ... ... ... ... ... ... ... ... ... ... ... 

Except with pretty colors :).