module Hix.Data.PackageName where

import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey)
import qualified Data.Set as Set
import qualified Distribution.Package as Cabal
import Distribution.Package (depPkgName, mkPackageName)
import Distribution.Pretty (Pretty (pretty))
import Distribution.Types.Dependency (Dependency)

import Hix.Class.EncodeNix (EncodeNixKey)
import Hix.Pretty (prettyText)

newtype PackageName =
  PackageName Text
  deriving stock (PackageName -> PackageName -> Bool
(PackageName -> PackageName -> Bool)
-> (PackageName -> PackageName -> Bool) -> Eq PackageName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PackageName -> PackageName -> Bool
== :: PackageName -> PackageName -> Bool
$c/= :: PackageName -> PackageName -> Bool
/= :: PackageName -> PackageName -> Bool
Eq, Int -> PackageName -> ShowS
[PackageName] -> ShowS
PackageName -> String
(Int -> PackageName -> ShowS)
-> (PackageName -> String)
-> ([PackageName] -> ShowS)
-> Show PackageName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PackageName -> ShowS
showsPrec :: Int -> PackageName -> ShowS
$cshow :: PackageName -> String
show :: PackageName -> String
$cshowList :: [PackageName] -> ShowS
showList :: [PackageName] -> ShowS
Show, (forall x. PackageName -> Rep PackageName x)
-> (forall x. Rep PackageName x -> PackageName)
-> Generic PackageName
forall x. Rep PackageName x -> PackageName
forall x. PackageName -> Rep PackageName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PackageName -> Rep PackageName x
from :: forall x. PackageName -> Rep PackageName x
$cto :: forall x. Rep PackageName x -> PackageName
to :: forall x. Rep PackageName x -> PackageName
Generic)
  deriving newtype (String -> PackageName
(String -> PackageName) -> IsString PackageName
forall a. (String -> a) -> IsString a
$cfromString :: String -> PackageName
fromString :: String -> PackageName
IsString, Eq PackageName
Eq PackageName =>
(PackageName -> PackageName -> Ordering)
-> (PackageName -> PackageName -> Bool)
-> (PackageName -> PackageName -> Bool)
-> (PackageName -> PackageName -> Bool)
-> (PackageName -> PackageName -> Bool)
-> (PackageName -> PackageName -> PackageName)
-> (PackageName -> PackageName -> PackageName)
-> Ord PackageName
PackageName -> PackageName -> Bool
PackageName -> PackageName -> Ordering
PackageName -> PackageName -> PackageName
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 :: PackageName -> PackageName -> Ordering
compare :: PackageName -> PackageName -> Ordering
$c< :: PackageName -> PackageName -> Bool
< :: PackageName -> PackageName -> Bool
$c<= :: PackageName -> PackageName -> Bool
<= :: PackageName -> PackageName -> Bool
$c> :: PackageName -> PackageName -> Bool
> :: PackageName -> PackageName -> Bool
$c>= :: PackageName -> PackageName -> Bool
>= :: PackageName -> PackageName -> Bool
$cmax :: PackageName -> PackageName -> PackageName
max :: PackageName -> PackageName -> PackageName
$cmin :: PackageName -> PackageName -> PackageName
min :: PackageName -> PackageName -> PackageName
Ord, Maybe PackageName
Value -> Parser [PackageName]
Value -> Parser PackageName
(Value -> Parser PackageName)
-> (Value -> Parser [PackageName])
-> Maybe PackageName
-> FromJSON PackageName
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser PackageName
parseJSON :: Value -> Parser PackageName
$cparseJSONList :: Value -> Parser [PackageName]
parseJSONList :: Value -> Parser [PackageName]
$comittedField :: Maybe PackageName
omittedField :: Maybe PackageName
FromJSON, FromJSONKeyFunction [PackageName]
FromJSONKeyFunction PackageName
FromJSONKeyFunction PackageName
-> FromJSONKeyFunction [PackageName] -> FromJSONKey PackageName
forall a.
FromJSONKeyFunction a -> FromJSONKeyFunction [a] -> FromJSONKey a
$cfromJSONKey :: FromJSONKeyFunction PackageName
fromJSONKey :: FromJSONKeyFunction PackageName
$cfromJSONKeyList :: FromJSONKeyFunction [PackageName]
fromJSONKeyList :: FromJSONKeyFunction [PackageName]
FromJSONKey, [PackageName] -> Value
[PackageName] -> Encoding
PackageName -> Bool
PackageName -> Value
PackageName -> Encoding
(PackageName -> Value)
-> (PackageName -> Encoding)
-> ([PackageName] -> Value)
-> ([PackageName] -> Encoding)
-> (PackageName -> Bool)
-> ToJSON PackageName
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: PackageName -> Value
toJSON :: PackageName -> Value
$ctoEncoding :: PackageName -> Encoding
toEncoding :: PackageName -> Encoding
$ctoJSONList :: [PackageName] -> Value
toJSONList :: [PackageName] -> Value
$ctoEncodingList :: [PackageName] -> Encoding
toEncodingList :: [PackageName] -> Encoding
$comitField :: PackageName -> Bool
omitField :: PackageName -> Bool
ToJSON, ToJSONKeyFunction [PackageName]
ToJSONKeyFunction PackageName
ToJSONKeyFunction PackageName
-> ToJSONKeyFunction [PackageName] -> ToJSONKey PackageName
forall a.
ToJSONKeyFunction a -> ToJSONKeyFunction [a] -> ToJSONKey a
$ctoJSONKey :: ToJSONKeyFunction PackageName
toJSONKey :: ToJSONKeyFunction PackageName
$ctoJSONKeyList :: ToJSONKeyFunction [PackageName]
toJSONKeyList :: ToJSONKeyFunction [PackageName]
ToJSONKey, PackageName -> Text
(PackageName -> Text) -> EncodeNixKey PackageName
forall a. (a -> Text) -> EncodeNixKey a
$cencodeNixKey :: PackageName -> Text
encodeNixKey :: PackageName -> Text
EncodeNixKey)

instance Pretty PackageName where
  pretty :: PackageName -> Doc
pretty (PackageName Text
n) = Text -> Doc
prettyText Text
n

fromCabal :: Cabal.PackageName -> PackageName
fromCabal :: PackageName -> PackageName
fromCabal =
  String -> PackageName
forall a. IsString a => String -> a
fromString (String -> PackageName)
-> (PackageName -> String) -> PackageName -> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
Cabal.unPackageName

toCabal :: PackageName -> Cabal.PackageName
toCabal :: PackageName -> PackageName
toCabal (PackageName Text
name) =
  String -> PackageName
mkPackageName (Text -> String
forall a. ToString a => a -> String
toString Text
name)

depPackageName :: Dependency -> PackageName
depPackageName :: Dependency -> PackageName
depPackageName =
  PackageName -> PackageName
fromCabal (PackageName -> PackageName)
-> (Dependency -> PackageName) -> Dependency -> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dependency -> PackageName
depPkgName

newtype LocalPackage =
  LocalPackage PackageName
  deriving stock (LocalPackage -> LocalPackage -> Bool
(LocalPackage -> LocalPackage -> Bool)
-> (LocalPackage -> LocalPackage -> Bool) -> Eq LocalPackage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LocalPackage -> LocalPackage -> Bool
== :: LocalPackage -> LocalPackage -> Bool
$c/= :: LocalPackage -> LocalPackage -> Bool
/= :: LocalPackage -> LocalPackage -> Bool
Eq, Int -> LocalPackage -> ShowS
[LocalPackage] -> ShowS
LocalPackage -> String
(Int -> LocalPackage -> ShowS)
-> (LocalPackage -> String)
-> ([LocalPackage] -> ShowS)
-> Show LocalPackage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LocalPackage -> ShowS
showsPrec :: Int -> LocalPackage -> ShowS
$cshow :: LocalPackage -> String
show :: LocalPackage -> String
$cshowList :: [LocalPackage] -> ShowS
showList :: [LocalPackage] -> ShowS
Show, (forall x. LocalPackage -> Rep LocalPackage x)
-> (forall x. Rep LocalPackage x -> LocalPackage)
-> Generic LocalPackage
forall x. Rep LocalPackage x -> LocalPackage
forall x. LocalPackage -> Rep LocalPackage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. LocalPackage -> Rep LocalPackage x
from :: forall x. LocalPackage -> Rep LocalPackage x
$cto :: forall x. Rep LocalPackage x -> LocalPackage
to :: forall x. Rep LocalPackage x -> LocalPackage
Generic)
  deriving newtype (String -> LocalPackage
(String -> LocalPackage) -> IsString LocalPackage
forall a. (String -> a) -> IsString a
$cfromString :: String -> LocalPackage
fromString :: String -> LocalPackage
IsString, Eq LocalPackage
Eq LocalPackage =>
(LocalPackage -> LocalPackage -> Ordering)
-> (LocalPackage -> LocalPackage -> Bool)
-> (LocalPackage -> LocalPackage -> Bool)
-> (LocalPackage -> LocalPackage -> Bool)
-> (LocalPackage -> LocalPackage -> Bool)
-> (LocalPackage -> LocalPackage -> LocalPackage)
-> (LocalPackage -> LocalPackage -> LocalPackage)
-> Ord LocalPackage
LocalPackage -> LocalPackage -> Bool
LocalPackage -> LocalPackage -> Ordering
LocalPackage -> LocalPackage -> LocalPackage
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 :: LocalPackage -> LocalPackage -> Ordering
compare :: LocalPackage -> LocalPackage -> Ordering
$c< :: LocalPackage -> LocalPackage -> Bool
< :: LocalPackage -> LocalPackage -> Bool
$c<= :: LocalPackage -> LocalPackage -> Bool
<= :: LocalPackage -> LocalPackage -> Bool
$c> :: LocalPackage -> LocalPackage -> Bool
> :: LocalPackage -> LocalPackage -> Bool
$c>= :: LocalPackage -> LocalPackage -> Bool
>= :: LocalPackage -> LocalPackage -> Bool
$cmax :: LocalPackage -> LocalPackage -> LocalPackage
max :: LocalPackage -> LocalPackage -> LocalPackage
$cmin :: LocalPackage -> LocalPackage -> LocalPackage
min :: LocalPackage -> LocalPackage -> LocalPackage
Ord, Maybe LocalPackage
Value -> Parser [LocalPackage]
Value -> Parser LocalPackage
(Value -> Parser LocalPackage)
-> (Value -> Parser [LocalPackage])
-> Maybe LocalPackage
-> FromJSON LocalPackage
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser LocalPackage
parseJSON :: Value -> Parser LocalPackage
$cparseJSONList :: Value -> Parser [LocalPackage]
parseJSONList :: Value -> Parser [LocalPackage]
$comittedField :: Maybe LocalPackage
omittedField :: Maybe LocalPackage
FromJSON, FromJSONKeyFunction [LocalPackage]
FromJSONKeyFunction LocalPackage
FromJSONKeyFunction LocalPackage
-> FromJSONKeyFunction [LocalPackage] -> FromJSONKey LocalPackage
forall a.
FromJSONKeyFunction a -> FromJSONKeyFunction [a] -> FromJSONKey a
$cfromJSONKey :: FromJSONKeyFunction LocalPackage
fromJSONKey :: FromJSONKeyFunction LocalPackage
$cfromJSONKeyList :: FromJSONKeyFunction [LocalPackage]
fromJSONKeyList :: FromJSONKeyFunction [LocalPackage]
FromJSONKey, CabalSpecVersion -> LocalPackage -> Doc
LocalPackage -> Doc
(LocalPackage -> Doc)
-> (CabalSpecVersion -> LocalPackage -> Doc) -> Pretty LocalPackage
forall a. (a -> Doc) -> (CabalSpecVersion -> a -> Doc) -> Pretty a
$cpretty :: LocalPackage -> Doc
pretty :: LocalPackage -> Doc
$cprettyVersioned :: CabalSpecVersion -> LocalPackage -> Doc
prettyVersioned :: CabalSpecVersion -> LocalPackage -> Doc
Pretty, LocalPackage -> Text
(LocalPackage -> Text) -> EncodeNixKey LocalPackage
forall a. (a -> Text) -> EncodeNixKey a
$cencodeNixKey :: LocalPackage -> Text
encodeNixKey :: LocalPackage -> Text
EncodeNixKey)

localPackageName :: LocalPackage -> PackageName
localPackageName :: LocalPackage -> PackageName
localPackageName = LocalPackage -> PackageName
forall a b. Coercible a b => a -> b
coerce

localPackageNames :: [LocalPackage] -> [PackageName]
localPackageNames :: [LocalPackage] -> [PackageName]
localPackageNames = [LocalPackage] -> [PackageName]
forall a b. Coercible a b => a -> b
coerce

sameLocalPackage :: LocalPackage -> PackageName -> Bool
sameLocalPackage :: LocalPackage -> PackageName -> Bool
sameLocalPackage (LocalPackage PackageName
lp) PackageName
p = PackageName
lp PackageName -> PackageName -> Bool
forall a. Eq a => a -> a -> Bool
== PackageName
p

isLocalPackage :: Set LocalPackage -> PackageName -> Bool
isLocalPackage :: Set LocalPackage -> PackageName -> Bool
isLocalPackage Set LocalPackage
lps PackageName
p = LocalPackage -> Set LocalPackage -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member (PackageName -> LocalPackage
LocalPackage PackageName
p) Set LocalPackage
lps

toLocalPackage :: Set LocalPackage -> PackageName -> Maybe LocalPackage
toLocalPackage :: Set LocalPackage -> PackageName -> Maybe LocalPackage
toLocalPackage Set LocalPackage
lps PackageName
p
  | Set LocalPackage -> PackageName -> Bool
isLocalPackage Set LocalPackage
lps PackageName
p
  = LocalPackage -> Maybe LocalPackage
forall a. a -> Maybe a
Just (PackageName -> LocalPackage
LocalPackage PackageName
p)
  | Bool
otherwise
  = Maybe LocalPackage
forall a. Maybe a
Nothing