{-# LANGUAGE TemplateHaskell #-} module Xml.DeriveAll (deriveAll) where import Data.Generics as Old import Data.Generics.SYB.WithClass.Derive import Language.Haskell.TH deriveAll :: Q [Dec] -> Q [Dec] deriveAll qdecs = do decs <- qdecs derivedDecs <- deriveDec (filter isDataOrNewtype decs) let decs' = map deriveOldData decs return (decs' ++ derivedDecs) deriveOldData :: Dec -> Dec deriveOldData (DataD ctxt nm tvs cons derivs) = DataD ctxt nm tvs cons (''Old.Data : derivs) deriveOldData (NewtypeD ctxt nm tvs con derivs) = NewtypeD ctxt nm tvs con (''Old.Data : derivs) deriveOldData d = d isDataOrNewtype :: Dec -> Bool isDataOrNewtype (DataD {}) = True isDataOrNewtype (NewtypeD {}) = True isDataOrNewtype _ = False