packages feed

arion-0.1.0.5: src/Arion/Utilities.hs

module Arion.Utilities (
    associate
) where

import Arion.Types
import Data.Map (Map, fromList)
import Data.List (union)

associate :: [SourceFile] -> [TestFile] -> Map FilePath [TestFile]
associate sourceFiles testFiles = let preTransitive = map (createAssociations testFiles) sourceFiles
                                      transitive = map (\(sourceFile, testsAssociatedWithSource) -> let imports = importedModules sourceFile
                                                                                                        testsAssociatedWithImports =
                                                                                                            concatMap snd $ concatMap (\imp -> filter (\(source, tests) -> moduleName source == imp) preTransitive) imports
                                                                                                    in (sourceFilePath sourceFile, testsAssociatedWithSource `union` testsAssociatedWithImports)
                                                       ) preTransitive
                                  in fromList transitive

createAssociations :: [TestFile] -> SourceFile -> (SourceFile, [TestFile])
createAssociations testFiles sourceFile = let associatedTestFiles = filter (\testFile -> moduleName sourceFile `elem` imports testFile) testFiles
                                          in (sourceFile, associatedTestFiles)