{-# Language PatternGuards #-}
module CabalBounds.Bound
( DropBound(..)
, UpdateBound(..)
, boundOfDrop
, boundOfUpdate
) where
import CabalBounds.Args (Args(Drop, Update))
import qualified CabalBounds.Args as A
import CabalBounds.VersionComp (VersionComp(..), defaultLowerComp, defaultUpperComp)
import Data.Maybe (isJust)
data DropBound = DropUpper
| DropBoth
deriving (Show, Eq)
type IfMissing = Bool
type LowerComp = VersionComp
type UpperComp = VersionComp
data UpdateBound = UpdateLower LowerComp IfMissing
| UpdateUpper UpperComp IfMissing
| UpdateBoth LowerComp UpperComp IfMissing
deriving (Show, Eq)
boundOfDrop :: Args -> DropBound
boundOfDrop Drop {A.upper = upper} = if upper then DropUpper else DropBoth
boundOfDrop _ = error "Expected Drop Args!"
boundOfUpdate :: Args -> UpdateBound
boundOfUpdate upd@Update {}
| hasLower && hasUpper
= UpdateBoth lowerComp upperComp ifMissing
| hasLower
= UpdateLower lowerComp ifMissing
| hasUpper
= UpdateUpper upperComp ifMissing
| otherwise
= UpdateBoth lowerComp upperComp ifMissing
where
lowerComp
| Just comp <- A.lowerComp upd
= comp
| otherwise
= defaultLowerComp
upperComp
| Just comp <- A.upperComp upd
= comp
| otherwise
= defaultUpperComp
ifMissing = A.missing upd
hasLower = A.lower upd || (isJust . A.lowerComp $ upd)
hasUpper = A.upper upd || (isJust . A.upperComp $ upd)
boundOfUpdate _ = error "Expected Update Args!"