Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Template Haskell code to generate gdiff GADTs and class instances
Haskell
branch: master

Merge pull request #1 from ggreif/master

Modenise dependencies
latest commit e538ca5c41
@jfischoff authored
Failed to load latest commit information.
examples added commented out cabal config for an example app
src/Data/Generic/Diff fixed doc
tests modified code to compile on multiple ghc's
.ghci better example. chhecks if the type is monomorphic
.gitignore removed .prof file
LICENSE
README.md
Setup.hs first commit
gdiff-th.cabal accept mtl-2.2

README.md

Generate GDiff GADTs and Associated Instances

gdiff-th is a library for generating the necessary apparatus for preforming typesafe 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
    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 :).

Something went wrong with that request. Please try again.