module ExRender.Dependency () where
import Distribution.Text
import Distribution.Package
import Distribution.Version
import ExRender.Base
instance ExRender LowerBound where
exDisp (LowerBound v InclusiveBound) = ">=" <> disp v
exDisp (LowerBound v ExclusiveBound) = ">" <> disp v
instance ExRender UpperBound where
exDisp (UpperBound v InclusiveBound) = "<=" <> disp v
exDisp (UpperBound v ExclusiveBound) = "<" <> disp v
exDisp x = error $ "Unsupported UpperBound: " ++ show x
maybeExVersion ∷ VersionInterval → Maybe Doc
maybeExVersion = \case
(LowerBound a InclusiveBound, UpperBound b InclusiveBound)
| a == b → Just $ char '=' <> disp a
(LowerBound (Version [0] []) InclusiveBound, ub) → Just $ exDisp ub
(lb, NoUpperBound) → Just $ exDisp lb
(LowerBound (Version [] _) _, _) → Nothing
(_, UpperBound (Version [] _) _) → Nothing
(LowerBound v@(Version a []) InclusiveBound, UpperBound (Version b []) ExclusiveBound)
| init a == init b && succ (last a) == last b →
Just $ char '=' <> disp v <> char '*'
(LowerBound (Version [_] _) _, _) → Nothing
(LowerBound v@(Version a []) InclusiveBound, UpperBound (Version b []) ExclusiveBound)
| init a' == init b && succ (last a') == last b →
Just $ text "~>" <> disp v
where a' = init a
_ → Nothing
exVersions ∷ VersionInterval → [Doc]
exVersions = \case
(maybeExVersion → Just x) → [x]
(lb, UpperBound v InclusiveBound) →
exVersions (lb, UpperBound v ExclusiveBound) ++ [char '=' <> disp v]
(LowerBound va@(Version a _) InclusiveBound, ub@(UpperBound (Version b _) ExclusiveBound))
| init a == init b → do
c ← [init a ++ [i] | i ← [last a .. last b 1]]
return $ char '=' <> disp (Version c []) <> char '*'
| length a < length b →
char '=' <> disp va : exVersions (LowerBound (Version (a ++ [0]) []) InclusiveBound, ub)
_ → []
instance ExRender VersionInterval where
exDisp (LowerBound (Version [0] []) InclusiveBound, NoUpperBound) = empty
exDisp (maybeExVersion → Just exVi) = exVi
exDisp (lb, ub) = exDisp lb <> char '&' <> exDisp ub
instance ExRender VersionRange where
exDisp vr = case asVersionIntervals vr of
[vi] → nbrackets $ exDisp vi
(concatMap exVersions → exVis) | not $ null exVis → nbrackets . hcat $ punctuate (char '|') exVis
_ → error $ "Unsupported version range: " ++ display vr
instance ExRender Dependency where
exDisp (Dependency n vr) = "dev-haskell/" <> disp n <> exDisp vr