module Hoogle.DataBase.TypeSearch.Cost(
    Cost(..), cost, score, (*+)
    ) where


infixl 7  *+ -- same as *

(*+) :: Cost -> Int -> [Cost]
(*+) = flip replicate


data Cost = CostAliasFwd
          | CostAliasBwd
          | CostUnbox
          | CostRebox
          | CostRestrict
          | CostUnrestrict
          | CostDupVarResult
          | CostDupVarQuery
          | CostInstanceDel
          | CostInstanceAdd
          | CostDeadArg
          | CostArgReorder
            deriving (Show,Eq,Ord,Enum,Bounded)


score :: [Cost] -> Int
score = sum . map cost


cost :: Cost -> Int
cost CostAliasFwd     =    1  -- 1..1000
cost CostAliasBwd     =    1  -- 1..997
cost CostUnbox        =    5  -- 5..1000
cost CostRebox        =    4  -- 4..999
cost CostRestrict     =    5  -- 5..1000
cost CostUnrestrict   =    4  -- 4..1000
cost CostDupVarResult =    4  -- 4..999
cost CostDupVarQuery  =    5  -- 5..1000
cost CostInstanceDel  =    4  -- 4..999
cost CostInstanceAdd  =    4  -- 4..999
cost CostDeadArg      =    3  -- 3..998
cost CostArgReorder   =    1  -- 1..1000