cabal-query-0.1: Helpers for quering .cabal files or hackageDB's 00-index.tarSource codeContentsIndex
Distribution.Query
Description

This package uses Data.Generics.PlateData, so

  • when Cabal package format changes, we don't have to rewrite anything
  • all queries are statically typed
  • as a disadvantage, we may suffer some performance loss when doing very complex queries, anyway most of processing goes while we read package descriptions, not querying them

Example of enduser querying code:

module Main where

import qualified Data.ByteString.Lazy as B
import System.Environment
import Distribution.Query
import Distribution.Compiler
import Distribution.License
import Distribution.ModuleName hiding (main)
import Distribution.Package
import Distribution.PackageDescription
import Distribution.Version
import Distribution.Text
import Language.Haskell.Extension

main = (head `fmap` getArgs) >>=
        B.readFile >>=
        mapM_ (putStrLn . show . (x -> (display $ package x, display $ license x))) .
        queryIndex (Not (Id (== GPL)) :& Not (Id (== BSD3)))

You can query any field of PackageDescription no matter how deep it is. You don't need to provide any type signature for comparison functions, which are wrapped in Id, as long as you use data constructors for which type can be inferred.

See PackageDescription fields for details.

Synopsis
queryFiles :: Query -> [ByteString] -> [PackageDescription]
queryIndex :: Query -> ByteString -> [PackageDescription]
data Query where
:& :: Query -> Query -> Query
:| :: Query -> Query -> Query
Not :: Query -> Query
Id :: Data a => (a -> Bool) -> Query
Documentation
queryFilesSource
:: Query
-> [ByteString]All files must be read as lazy ByteStrings
-> [PackageDescription]Returns a list of package descriptions which satisfy the query
Queries .cabal files.
queryIndexSource
:: Query
-> ByteStringThe index file must be read as lazy ByteString
-> [PackageDescription]Returns a list of package descriptions which satisfy the query
Queries an index file, which is commonly located at ~/.cabal/packages/hackage.haskell.org/00-index.tar in POSIX systems.
data Query whereSource

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.

Constructors
:& :: Query -> Query -> Query
:| :: Query -> Query -> Query
Not :: Query -> Query
Id :: Data a => (a -> Bool) -> Query
Produced by Haddock version 2.4.2