cabal-query-0.1: src/Distribution/Query/Types.hs
{-# LANGUAGE TemplateHaskell, GADTs #-}
module Distribution.Query.Types
( Query(..) ) where
import Data.Data
import Data.DeriveTH
import Data.List.Utils (join)
import Distribution.Compiler
import Distribution.License
import Distribution.ModuleName hiding (main)
import Distribution.Package
import Distribution.PackageDescription
import Distribution.Version
import Language.Haskell.Extension
import Distribution.Query.TH
-- | Heterogenous query tree. Example of constructed query:
--
-- > Not (Id (== GPL)) :& Not (Id (== BSD3))
--
-- 'Id' takes comparison function as its argument.
-- Commonly this must be a partially applied ('/=') or ('==').
-- Data instance is required for 'PackageDescription' traversal.
-- All appropriate instances are generated automagically,
-- so you don't have to bother as long as Cabal doesn't change its
-- package description format.
data Query where
(:&) :: Query -> Query -> Query
(:|) :: Query -> Query -> Query
Not :: Query -> Query
Id :: Data a => (a -> Bool) -> Query
$(deriveMany makeTypeable
[''PackageDescription
,''Executable
,''Library
,''BuildType
,''VersionRange
,''Dependency
,''SourceRepo
,''CompilerFlavor
,''License
,''PackageIdentifier
,''BuildInfo
,''ModuleName
,''PackageName
,''RepoType
,''RepoKind
,''Extension])
$(deriveMany makeData
[''PackageDescription
,''Executable
,''Library
,''BuildType
,''VersionRange
,''Dependency
,''SourceRepo
,''CompilerFlavor
,''License
,''PackageIdentifier
,''BuildInfo
,''PackageName
,''RepoType
,''RepoKind
,''Extension
,''Version])
-- Workaround for ModuleName, see http://code.google.com/p/ndmitchell/issues/detail?id=209
instance Data ModuleName where
gfoldl _ z = z . simple . join "." . components
gunfold _ z _ = z $ simple ""
toConstr _ = con_C
dataTypeOf _ = ty_T
con_C :: Constr
con_C = mkConstr ty_T "ModuleName" [] Prefix
ty_T :: DataType
ty_T = mkDataType "Distribution.ModuleName.ModuleName" [con_C]