packages feed

gpah-0.0.1: src/Generics/GPAH/Hackage/Analyze.hs

module Generics.GPAH.Hackage.Analyze where

import Generics.GPAH.Hackage.Base
import Generics.GPAH.Utils
import qualified Data.Map as M

import Data.List (nub, intersect)
import Data.Monoid


import Language.Haskell.Exts
import Language.Haskell.Exts.Comments
import Distribution.PackageDescription
import Distribution.Package

analyzeModule :: ParseResult (Module, [Comment]) -> Analysis
analyzeModule (ParseOk _) = mempty {parsedModules=1}
analyzeModule (ParseFailed (SrcLoc {srcFilename = hs}) _) = mempty {failedModules = [hs]}

analyzePackage :: String -> GenericPackageDescription -> Analysis
analyzePackage pkgname gpkgdesc = Analysis 
                          1 
                          0
                          []
                          (fromBool usesGP) 
                          (fromBool isExe)
                          reverseDeps
    where
      ds = cabalDepends gpkgdesc
      usesGP = any (`elem` ds) libsGP
      isExe = cabalHasExecs gpkgdesc && usesGP
      reverseDeps = M.fromList (zip 
                                     (ds `intersect` libsGP) -- the gp deps of the pkg
                                     (repeat [pkgname])
                               )




cabalHasExecs :: GenericPackageDescription -> Bool
cabalHasExecs (GenericPackageDescription _ _ _ execs _ _) = not $ null execs

cabalDepends :: GenericPackageDescription -> [String]
cabalDepends gpkgdesc = 
  let pds = pkgDepends gpkgdesc
      dName :: Dependency -> String
      dName (Dependency (PackageName s) _) = s
      dNames = nub $ map dName pds
  in dNames


-- Takes a parsed Cabal GenericPackageDescription and return a list of Dependencies
pkgDepends :: GenericPackageDescription -> [Dependency]  
pkgDepends (GenericPackageDescription pkgdesc _ lib execs tests _) = pkgdescDepends pkgdesc ++ libDepends lib ++ execsDepends execs ++ testsDepends tests
  where    
    pkgdescDepends = buildDepends
    libDepends mnode = maybe [] nodeDepends mnode
    execsDepends es  =  concatMap (nodeDepends . snd) es
    testsDepends = execsDepends
    nodeDepends :: CondTree v [Dependency] a -> [Dependency]
    nodeDepends (CondNode {condTreeConstraints = ds}) = ds