module Unused.Aliases
( groupedTermsAndAliases
, termsAndAliases
) where
import qualified Data.List as L
import Data.Text (Text)
import qualified Data.Text as T
import Unused.ResultsClassifier.Types
import Unused.Types (SearchTerm(..), TermMatch, tmTerm)
import Unused.Util (groupBy)
groupedTermsAndAliases :: [TermMatch] -> [[TermMatch]]
groupedTermsAndAliases = map snd . groupBy tmTerm
termsAndAliases :: [TermAlias] -> [String] -> [SearchTerm]
termsAndAliases [] = map OriginalTerm
termsAndAliases as = L.nub . concatMap ((as >>=) . generateSearchTerms . T.pack)
generateSearchTerms :: Text -> TermAlias -> [SearchTerm]
generateSearchTerms term TermAlias{taFrom = from, taTransform = transform} =
toTermWithAlias $ parsePatternForMatch (T.pack from) term
where
toTermWithAlias (Right (Just match)) = [OriginalTerm unpackedTerm, AliasTerm unpackedTerm (aliasedResult match)]
toTermWithAlias _ = [OriginalTerm unpackedTerm]
unpackedTerm = T.unpack term
aliasedResult = T.unpack . transform
parsePatternForMatch :: Text -> Text -> Either Text (Maybe Text)
parsePatternForMatch aliasPattern term =
findMatch $ T.splitOn wildcard aliasPattern
where
findMatch [prefix, suffix] = Right $ T.stripSuffix suffix =<< T.stripPrefix prefix term
findMatch _ = Left $ T.pack $ "There was a problem with the pattern: " ++ show aliasPattern
wildcard :: Text
wildcard = "*"