elm-make-0.1: src/CrawlProject.hs
{-# LANGUAGE FlexibleContexts #-}
module CrawlProject where
import qualified Data.Map as Map
import qualified Elm.Compiler.Module as Module
import TheMasterPlan
( ModuleID(ModuleID), PackageID, Location(Location)
, PackageSummary(..), PackageData(..)
, ProjectSummary(..), ProjectData(..)
)
canonicalizePackageSummary
:: PackageID
-> PackageSummary
-> ProjectSummary Location
canonicalizePackageSummary package (PackageSummary pkgData natives foreignDependencies) =
ProjectSummary
{ projectData =
Map.map
(canonicalizePackageData package foreignDependencies)
(canonicalizeKeys pkgData)
, projectNatives =
Map.map (\path -> Location path package) (canonicalizeKeys natives)
}
where
canonicalizeKeys =
Map.mapKeysMonotonic (\name -> ModuleID name package)
canonicalizePackageData
:: PackageID
-> Map.Map Module.Name PackageID
-> PackageData
-> ProjectData Location
canonicalizePackageData package foreignDependencies (PackageData filePath deps) =
ProjectData {
projectLocation = Location filePath package,
projectDependencies = map canonicalizeModule deps
}
where
canonicalizeModule :: Module.Name -> ModuleID
canonicalizeModule moduleName =
case Map.lookup moduleName foreignDependencies of
Nothing -> ModuleID moduleName package
Just foreignPackage ->
ModuleID moduleName foreignPackage
union :: ProjectSummary a -> ProjectSummary a -> ProjectSummary a
union (ProjectSummary d natives) (ProjectSummary d' natives') =
ProjectSummary (Map.union d d') (Map.union natives natives')