unused-0.6.0.0: src/Unused/LikelihoodCalculator.hs
module Unused.LikelihoodCalculator
( calculateLikelihood
, LanguageConfiguration
) where
import qualified Data.List as L
import qualified Data.Maybe as M
import qualified Unused.ResponseFilter as RF
import Unused.ResultsClassifier (LanguageConfiguration(..), LowLikelihoodMatch(..))
import Unused.Types (TermResults(..), Occurrences(..), RemovalLikelihood(..), Removal(..), totalOccurrenceCount)
calculateLikelihood :: [LanguageConfiguration] -> TermResults -> TermResults
calculateLikelihood lcs r =
r { trRemoval = uncurry Removal newLikelihood }
where
newLikelihood
| M.isJust firstAutoLowLikelihood = (Low, autoLowLikelihoodMessage)
| singleNonTestUsage r && testsExist r = (High, "only the definition and corresponding tests exist")
| doubleNonTestUsage r && testsExist r = (Medium, "only the definition and one other use, along with tests, exists")
| totalScore < 2 = (High, "occurs once")
| totalScore < 6 = (Medium, "used semi-frequently")
| totalScore >= 6 = (Low, "used frequently")
| otherwise = (Unknown, "could not determine likelihood")
totalScore = totalOccurrenceCount r
firstAutoLowLikelihood = L.find (`RF.autoLowLikelihood` r) lcs
autoLowLikelihoodMessage = maybe "" languageConfirmationMessage firstAutoLowLikelihood
languageConfirmationMessage :: LanguageConfiguration -> String
languageConfirmationMessage lc =
langFramework ++ ": allowed term or " ++ lowLikelihoodNames
where
langFramework = lcName lc
lowLikelihoodNames = L.intercalate ", " $ map smName $ lcAutoLowLikelihood lc
singleNonTestUsage :: TermResults -> Bool
singleNonTestUsage = (1 ==) . oOccurrences . trAppOccurrences
doubleNonTestUsage :: TermResults -> Bool
doubleNonTestUsage = (2 ==) . oOccurrences . trAppOccurrences
testsExist :: TermResults -> Bool
testsExist = (> 0) . oOccurrences . trTestOccurrences