Popularity
6.1
Stable
Activity
0.0
Stable
3
6
5

Monthly Downloads: 30
Programming language: Haskell
License: BSD 3-clause "New" or "Revised" License
Tags: Testing     Generics     Gdiff    

gdiff-th alternatives and similar packages

Based on the "Testing" category.
Alternatively, view gdiff-th alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of gdiff-th or a related project?

Add another 'Testing' Package

README

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 :).