module SearchTypes where

import Data.Map as Map (Map, empty, alter)
import Data.Version (Version)
import Distribution.Package (PackageIdentifier)
import Distribution.PackageDescription (PackageDescription, package)

-- | A search result.
data SearchResult = SearchResult
	{ foundPackage    :: PackageIdentifier
	, packageSynopsis :: String
	, otherVersions   :: [Version]
	, matchings       :: [(String, Double)]
	}

type LocalMatchingFunction = PackageDescription -> MatchingMap -> MatchingMap

type GlobalMatchingFunction = GlobalData -> MatchingMap -> MatchingMap

data GlobalData = GlobalData
	{ allAvailablePackages :: [PackageIdentifier]
	, dependsOnMap         :: Map.Map PackageIdentifier [PackageIdentifier]
	, requiredByMap        :: Map.Map PackageIdentifier [PackageIdentifier]
	}

type MatchingMap = Map.Map PackageIdentifier (Map.Map String Double)

localMatchingValue ::
	PackageDescription
	-> String
	-> Double
	-> MatchingMap
	-> MatchingMap
localMatchingValue pd = globalMatchingValue (package pd)

globalMatchingValue ::
	PackageIdentifier
	-> String
	-> Double
	-> MatchingMap
	-> MatchingMap
globalMatchingValue pkgId key value =
	Map.alter (Just . renew . maybe Map.empty id) pkgId
  where renew = Map.alter (Just . maybe value (max value)) key
