module Hix.Data.PackageId where

import Distribution.Package (PackageIdentifier (PackageIdentifier))
import Distribution.Pretty (Pretty (pretty))
import Distribution.Version (Version)
import Exon (exon)

import qualified Hix.Data.PackageName as PackageName
import Hix.Data.PackageName (PackageName (..))
import Hix.Pretty (prettyText, showP)

data PackageId =
  PackageId {
    PackageId -> PackageName
name :: PackageName,
    PackageId -> Version
version :: Version
  }
  deriving stock (PackageId -> PackageId -> Bool
(PackageId -> PackageId -> Bool)
-> (PackageId -> PackageId -> Bool) -> Eq PackageId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PackageId -> PackageId -> Bool
== :: PackageId -> PackageId -> Bool
$c/= :: PackageId -> PackageId -> Bool
/= :: PackageId -> PackageId -> Bool
Eq, Int -> PackageId -> ShowS
[PackageId] -> ShowS
PackageId -> String
(Int -> PackageId -> ShowS)
-> (PackageId -> String)
-> ([PackageId] -> ShowS)
-> Show PackageId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PackageId -> ShowS
showsPrec :: Int -> PackageId -> ShowS
$cshow :: PackageId -> String
show :: PackageId -> String
$cshowList :: [PackageId] -> ShowS
showList :: [PackageId] -> ShowS
Show, Eq PackageId
Eq PackageId =>
(PackageId -> PackageId -> Ordering)
-> (PackageId -> PackageId -> Bool)
-> (PackageId -> PackageId -> Bool)
-> (PackageId -> PackageId -> Bool)
-> (PackageId -> PackageId -> Bool)
-> (PackageId -> PackageId -> PackageId)
-> (PackageId -> PackageId -> PackageId)
-> Ord PackageId
PackageId -> PackageId -> Bool
PackageId -> PackageId -> Ordering
PackageId -> PackageId -> PackageId
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: PackageId -> PackageId -> Ordering
compare :: PackageId -> PackageId -> Ordering
$c< :: PackageId -> PackageId -> Bool
< :: PackageId -> PackageId -> Bool
$c<= :: PackageId -> PackageId -> Bool
<= :: PackageId -> PackageId -> Bool
$c> :: PackageId -> PackageId -> Bool
> :: PackageId -> PackageId -> Bool
$c>= :: PackageId -> PackageId -> Bool
>= :: PackageId -> PackageId -> Bool
$cmax :: PackageId -> PackageId -> PackageId
max :: PackageId -> PackageId -> PackageId
$cmin :: PackageId -> PackageId -> PackageId
min :: PackageId -> PackageId -> PackageId
Ord, (forall x. PackageId -> Rep PackageId x)
-> (forall x. Rep PackageId x -> PackageId) -> Generic PackageId
forall x. Rep PackageId x -> PackageId
forall x. PackageId -> Rep PackageId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PackageId -> Rep PackageId x
from :: forall x. PackageId -> Rep PackageId x
$cto :: forall x. Rep PackageId x -> PackageId
to :: forall x. Rep PackageId x -> PackageId
Generic)

renderPackage :: PackageId -> Text
renderPackage :: PackageId -> Text
renderPackage PackageId {Version
PackageName
name :: PackageId -> PackageName
version :: PackageId -> Version
name :: PackageName
version :: Version
..} =
  [exon|##{name}-#{showP version}|]

instance Pretty PackageId where
  pretty :: PackageId -> Doc
pretty = Text -> Doc
prettyText (Text -> Doc) -> (PackageId -> Text) -> PackageId -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageId -> Text
renderPackage

toCabal :: PackageId -> PackageIdentifier
toCabal :: PackageId -> PackageIdentifier
toCabal PackageId {Version
PackageName
name :: PackageId -> PackageName
version :: PackageId -> Version
name :: PackageName
version :: Version
..} =
  PackageName -> Version -> PackageIdentifier
PackageIdentifier (PackageName -> PackageName
PackageName.toCabal PackageName
name) Version
version

fromCabal :: PackageIdentifier -> PackageId
fromCabal :: PackageIdentifier -> PackageId
fromCabal (PackageIdentifier (PackageName -> PackageName
PackageName.fromCabal -> PackageName
name) Version
version) =
  PackageId {Version
PackageName
name :: PackageName
version :: Version
name :: PackageName
version :: Version
..}