module Unused.Parser
    ( parseResults
    ) where

import           Control.Arrow ((&&&))
import qualified Data.Bifunctor as BF
import qualified Data.List as L
import qualified Data.Map.Strict as Map
import           Unused.Aliases (groupedTermsAndAliases)
import           Unused.LikelihoodCalculator (calculateLikelihood)
import           Unused.ResultsClassifier.Types (LanguageConfiguration(..))
import           Unused.TermSearch (SearchResults, fromResults)
import           Unused.Types (TermMatchSet, TermMatch, resultsFromMatches, tmDisplayTerm)

parseResults :: [LanguageConfiguration] -> SearchResults -> TermMatchSet
parseResults lcs =
    Map.fromList . map (BF.second $ calculateLikelihood lcs . resultsFromMatches) . groupResults . fromResults

groupResults :: [TermMatch] -> [(String, [TermMatch])]
groupResults ms =
    map (toKey &&& id) groupedMatches
  where
    toKey = L.intercalate "|" . L.nub . L.sort . map tmDisplayTerm
    groupedMatches = groupedTermsAndAliases ms