{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Distribution.ArchHs.Name
( MyName,
unMyName,
HasMyName (..),
NameRep (..),
mToCommunityName,
mToHackageName,
toCommunityName,
toHackageName,
isHaskellPackage,
)
where
import Data.Char (toLower)
import Data.String
( IsString,
fromString,
)
import Distribution.ArchHs.Internal.NamePresetLoader
import Distribution.ArchHs.Internal.Prelude
import Distribution.ArchHs.Types
data NameRep
=
|
HackageRep
$()
communityToHackageP :: MyName 'CommunityRep -> Maybe (MyName 'HackageRep)
hackageToCommunityP :: MyName 'HackageRep -> Maybe (MyName 'CommunityRep)
falseListP :: [MyName 'CommunityRep]
communityListP :: [MyName 'CommunityRep]
newtype MyName a = MyName
{
MyName a -> String
unMyName :: String
}
deriving stock (Int -> MyName a -> ShowS
[MyName a] -> ShowS
MyName a -> String
(Int -> MyName a -> ShowS)
-> (MyName a -> String) -> ([MyName a] -> ShowS) -> Show (MyName a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k (a :: k). Int -> MyName a -> ShowS
forall k (a :: k). [MyName a] -> ShowS
forall k (a :: k). MyName a -> String
showList :: [MyName a] -> ShowS
$cshowList :: forall k (a :: k). [MyName a] -> ShowS
show :: MyName a -> String
$cshow :: forall k (a :: k). MyName a -> String
showsPrec :: Int -> MyName a -> ShowS
$cshowsPrec :: forall k (a :: k). Int -> MyName a -> ShowS
Show, ReadPrec [MyName a]
ReadPrec (MyName a)
Int -> ReadS (MyName a)
ReadS [MyName a]
(Int -> ReadS (MyName a))
-> ReadS [MyName a]
-> ReadPrec (MyName a)
-> ReadPrec [MyName a]
-> Read (MyName a)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall k (a :: k). ReadPrec [MyName a]
forall k (a :: k). ReadPrec (MyName a)
forall k (a :: k). Int -> ReadS (MyName a)
forall k (a :: k). ReadS [MyName a]
readListPrec :: ReadPrec [MyName a]
$creadListPrec :: forall k (a :: k). ReadPrec [MyName a]
readPrec :: ReadPrec (MyName a)
$creadPrec :: forall k (a :: k). ReadPrec (MyName a)
readList :: ReadS [MyName a]
$creadList :: forall k (a :: k). ReadS [MyName a]
readsPrec :: Int -> ReadS (MyName a)
$creadsPrec :: forall k (a :: k). Int -> ReadS (MyName a)
Read, MyName a -> MyName a -> Bool
(MyName a -> MyName a -> Bool)
-> (MyName a -> MyName a -> Bool) -> Eq (MyName a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k (a :: k). MyName a -> MyName a -> Bool
/= :: MyName a -> MyName a -> Bool
$c/= :: forall k (a :: k). MyName a -> MyName a -> Bool
== :: MyName a -> MyName a -> Bool
$c== :: forall k (a :: k). MyName a -> MyName a -> Bool
Eq, Eq (MyName a)
Eq (MyName a)
-> (MyName a -> MyName a -> Ordering)
-> (MyName a -> MyName a -> Bool)
-> (MyName a -> MyName a -> Bool)
-> (MyName a -> MyName a -> Bool)
-> (MyName a -> MyName a -> Bool)
-> (MyName a -> MyName a -> MyName a)
-> (MyName a -> MyName a -> MyName a)
-> Ord (MyName a)
MyName a -> MyName a -> Bool
MyName a -> MyName a -> Ordering
MyName a -> MyName a -> MyName a
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
forall k (a :: k). Eq (MyName a)
forall k (a :: k). MyName a -> MyName a -> Bool
forall k (a :: k). MyName a -> MyName a -> Ordering
forall k (a :: k). MyName a -> MyName a -> MyName a
min :: MyName a -> MyName a -> MyName a
$cmin :: forall k (a :: k). MyName a -> MyName a -> MyName a
max :: MyName a -> MyName a -> MyName a
$cmax :: forall k (a :: k). MyName a -> MyName a -> MyName a
>= :: MyName a -> MyName a -> Bool
$c>= :: forall k (a :: k). MyName a -> MyName a -> Bool
> :: MyName a -> MyName a -> Bool
$c> :: forall k (a :: k). MyName a -> MyName a -> Bool
<= :: MyName a -> MyName a -> Bool
$c<= :: forall k (a :: k). MyName a -> MyName a -> Bool
< :: MyName a -> MyName a -> Bool
$c< :: forall k (a :: k). MyName a -> MyName a -> Bool
compare :: MyName a -> MyName a -> Ordering
$ccompare :: forall k (a :: k). MyName a -> MyName a -> Ordering
$cp1Ord :: forall k (a :: k). Eq (MyName a)
Ord, (forall x. MyName a -> Rep (MyName a) x)
-> (forall x. Rep (MyName a) x -> MyName a) -> Generic (MyName a)
forall x. Rep (MyName a) x -> MyName a
forall x. MyName a -> Rep (MyName a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k (a :: k) x. Rep (MyName a) x -> MyName a
forall k (a :: k) x. MyName a -> Rep (MyName a) x
$cto :: forall k (a :: k) x. Rep (MyName a) x -> MyName a
$cfrom :: forall k (a :: k) x. MyName a -> Rep (MyName a) x
Generic)
deriving anyclass (MyName a -> ()
(MyName a -> ()) -> NFData (MyName a)
forall a. (a -> ()) -> NFData a
forall k (a :: k). MyName a -> ()
rnf :: MyName a -> ()
$crnf :: forall k (a :: k). MyName a -> ()
NFData)
instance IsString (MyName a) where
fromString :: String -> MyName a
fromString = String -> MyName a
forall k (a :: k). String -> MyName a
MyName
class HasMyName a where
toHackageRep :: a -> MyName 'HackageRep
:: a -> MyName 'CommunityRep
instance HasMyName (MyName 'CommunityRep) where
toHackageRep :: MyName 'CommunityRep -> MyName 'HackageRep
toHackageRep = CommunityName -> MyName 'HackageRep
forall a. HasMyName a => a -> MyName 'HackageRep
toHackageRep (CommunityName -> MyName 'HackageRep)
-> (MyName 'CommunityRep -> CommunityName)
-> MyName 'CommunityRep
-> MyName 'HackageRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> CommunityName
CommunityName (String -> CommunityName)
-> (MyName 'CommunityRep -> String)
-> MyName 'CommunityRep
-> CommunityName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MyName 'CommunityRep -> String
forall k (a :: k). MyName a -> String
unMyName
toCommunityRep :: MyName 'CommunityRep -> MyName 'CommunityRep
toCommunityRep = MyName 'CommunityRep -> MyName 'CommunityRep
forall a. a -> a
id
instance HasMyName (MyName 'HackageRep) where
toHackageRep :: MyName 'HackageRep -> MyName 'HackageRep
toHackageRep = MyName 'HackageRep -> MyName 'HackageRep
forall a. a -> a
id
toCommunityRep :: MyName 'HackageRep -> MyName 'CommunityRep
toCommunityRep = PackageName -> MyName 'CommunityRep
forall a. HasMyName a => a -> MyName 'CommunityRep
toCommunityRep (PackageName -> MyName 'CommunityRep)
-> (MyName 'HackageRep -> PackageName)
-> MyName 'HackageRep
-> MyName 'CommunityRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PackageName
mkPackageName (String -> PackageName)
-> (MyName 'HackageRep -> String)
-> MyName 'HackageRep
-> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MyName 'HackageRep -> String
forall k (a :: k). MyName a -> String
unMyName
instance HasMyName PackageName where
toHackageRep :: PackageName -> MyName 'HackageRep
toHackageRep = String -> MyName 'HackageRep
forall k (a :: k). String -> MyName a
MyName (String -> MyName 'HackageRep)
-> (PackageName -> String) -> PackageName -> MyName 'HackageRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
unPackageName
toCommunityRep :: PackageName -> MyName 'CommunityRep
toCommunityRep = String -> MyName 'CommunityRep
go (String -> MyName 'CommunityRep)
-> (PackageName -> String) -> PackageName -> MyName 'CommunityRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
unPackageName
where
go :: String -> MyName 'CommunityRep
go String
s = case MyName 'HackageRep -> Maybe (MyName 'CommunityRep)
hackageToCommunityP (String -> MyName 'HackageRep
forall k (a :: k). String -> MyName a
MyName String
s) of
Just MyName 'CommunityRep
x -> MyName 'CommunityRep
x
Maybe (MyName 'CommunityRep)
_ ->
String -> MyName 'CommunityRep
forall k (a :: k). String -> MyName a
MyName (String -> MyName 'CommunityRep)
-> ShowS -> String -> MyName 'CommunityRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower (String -> MyName 'CommunityRep) -> String -> MyName 'CommunityRep
forall a b. (a -> b) -> a -> b
$
( if String
"haskell-" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
s
then String
s
else String
"haskell-" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
s
)
instance HasMyName CommunityName where
toHackageRep :: CommunityName -> MyName 'HackageRep
toHackageRep = String -> MyName 'HackageRep
go (String -> MyName 'HackageRep)
-> (CommunityName -> String) -> CommunityName -> MyName 'HackageRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CommunityName -> String
unCommunityName
where
go :: String -> MyName 'HackageRep
go String
s = case MyName 'CommunityRep -> Maybe (MyName 'HackageRep)
communityToHackageP (String -> MyName 'CommunityRep
forall k (a :: k). String -> MyName a
MyName String
s) of
Just MyName 'HackageRep
x -> MyName 'HackageRep
x
Maybe (MyName 'HackageRep)
_ -> String -> MyName 'HackageRep
forall k (a :: k). String -> MyName a
MyName (String -> MyName 'HackageRep) -> String -> MyName 'HackageRep
forall a b. (a -> b) -> a -> b
$ Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
8 String
s
toCommunityRep :: CommunityName -> MyName 'CommunityRep
toCommunityRep = String -> MyName 'CommunityRep
forall k (a :: k). String -> MyName a
MyName (String -> MyName 'CommunityRep)
-> (CommunityName -> String)
-> CommunityName
-> MyName 'CommunityRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CommunityName -> String
unCommunityName
mToCommunityName :: MyName 'CommunityRep -> CommunityName
= String -> CommunityName
CommunityName (String -> CommunityName)
-> (MyName 'CommunityRep -> String)
-> MyName 'CommunityRep
-> CommunityName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MyName 'CommunityRep -> String
forall k (a :: k). MyName a -> String
unMyName
mToHackageName :: MyName 'HackageRep -> PackageName
mToHackageName :: MyName 'HackageRep -> PackageName
mToHackageName = String -> PackageName
mkPackageName (String -> PackageName)
-> (MyName 'HackageRep -> String)
-> MyName 'HackageRep
-> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MyName 'HackageRep -> String
forall k (a :: k). MyName a -> String
unMyName
toCommunityName :: HasMyName n => n -> CommunityName
= MyName 'CommunityRep -> CommunityName
mToCommunityName (MyName 'CommunityRep -> CommunityName)
-> (n -> MyName 'CommunityRep) -> n -> CommunityName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. n -> MyName 'CommunityRep
forall a. HasMyName a => a -> MyName 'CommunityRep
toCommunityRep
toHackageName :: HasMyName n => n -> PackageName
toHackageName :: n -> PackageName
toHackageName = MyName 'HackageRep -> PackageName
mToHackageName (MyName 'HackageRep -> PackageName)
-> (n -> MyName 'HackageRep) -> n -> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. n -> MyName 'HackageRep
forall a. HasMyName a => a -> MyName 'HackageRep
toHackageRep
isHaskellPackage :: CommunityName -> Bool
isHaskellPackage :: CommunityName -> Bool
isHaskellPackage CommunityName
name =
let rep :: MyName 'CommunityRep
rep = CommunityName -> MyName 'CommunityRep
forall a. HasMyName a => a -> MyName 'CommunityRep
toCommunityRep CommunityName
name
in (MyName 'CommunityRep
rep MyName 'CommunityRep -> [MyName 'CommunityRep] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [MyName 'CommunityRep]
communityListP Bool -> Bool -> Bool
|| String
"haskell-" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` (MyName 'CommunityRep -> String
forall k (a :: k). MyName a -> String
unMyName MyName 'CommunityRep
rep)) Bool -> Bool -> Bool
&& MyName 'CommunityRep
rep MyName 'CommunityRep -> [MyName 'CommunityRep] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [MyName 'CommunityRep]
falseListP