module Unused.Parser
    ( parseResults
    ) where

import Data.Bifunctor (second)
import Control.Arrow ((&&&))
import qualified Data.Map.Strict as Map
import Data.List (intercalate, sort, nub)
import Unused.TermSearch (SearchResults, fromResults)
import Unused.Types (TermMatchSet, TermMatch, resultsFromMatches, tmTerm)
import Unused.LikelihoodCalculator
import Unused.ResultsClassifier.Types
import Unused.Aliases

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

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