{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ViewPatterns #-}
module Distribution.ArchHs.Name
( MyName,
NameRep (..),
HasMyName (..),
toArchLinuxName,
toHackageName,
isHaskellPackage,
isGHCLibs,
)
where
import Data.Char (toLower)
import Data.String (IsString, fromString)
import Distribution.ArchHs.Internal.NamePresetLoader
import Distribution.ArchHs.Internal.Prelude
import Distribution.ArchHs.Local
import Distribution.ArchHs.Types
data NameRep
=
ArchLinuxRep
|
HackageRep
$
extraToHackageP :: MyName 'ArchLinuxRep -> Maybe (MyName 'HackageRep)
hackageToExtraP :: MyName 'HackageRep -> Maybe (MyName 'ArchLinuxRep)
extraListP :: [MyName 'ArchLinuxRep]
newtype MyName a = MyName
{
forall {k} (a :: k). MyName a -> String
unsafeUnMyName :: String
}
deriving stock (Int -> MyName a -> ShowS
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)
ReadS [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
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, MyName a -> MyName a -> Bool
MyName a -> MyName a -> Ordering
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
Ord, 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 (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 = forall k (a :: k). String -> MyName a
MyName
class HasMyName a where
toHackageRep :: a -> MyName 'HackageRep
toArchLinuxRep :: a -> MyName 'ArchLinuxRep
instance HasMyName (MyName 'ArchLinuxRep) where
toHackageRep :: MyName 'ArchLinuxRep -> MyName 'HackageRep
toHackageRep = forall a. HasMyName a => a -> MyName 'HackageRep
toHackageRep forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ArchLinuxName
ArchLinuxName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (a :: k). MyName a -> String
unsafeUnMyName
toArchLinuxRep :: MyName 'ArchLinuxRep -> MyName 'ArchLinuxRep
toArchLinuxRep = forall a. a -> a
id
instance HasMyName (MyName 'HackageRep) where
toHackageRep :: MyName 'HackageRep -> MyName 'HackageRep
toHackageRep = forall a. a -> a
id
toArchLinuxRep :: MyName 'HackageRep -> MyName 'ArchLinuxRep
toArchLinuxRep = forall a. HasMyName a => a -> MyName 'ArchLinuxRep
toArchLinuxRep forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PackageName
mkPackageName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (a :: k). MyName a -> String
unsafeUnMyName
instance HasMyName PackageName where
toHackageRep :: PackageName -> MyName 'HackageRep
toHackageRep = forall k (a :: k). String -> MyName a
MyName forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
unPackageName
toArchLinuxRep :: PackageName -> MyName 'ArchLinuxRep
toArchLinuxRep = String -> MyName 'ArchLinuxRep
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
unPackageName
where
go :: String -> MyName 'ArchLinuxRep
go String
s = case MyName 'HackageRep -> Maybe (MyName 'ArchLinuxRep)
hackageToExtraP (forall k (a :: k). String -> MyName a
MyName String
s) of
Just MyName 'ArchLinuxRep
x -> MyName 'ArchLinuxRep
x
Maybe (MyName 'ArchLinuxRep)
_ ->
forall k (a :: k). String -> MyName a
MyName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower forall a b. (a -> b) -> a -> b
$
( if String
"haskell-" forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
s
then String
s
else String
"haskell-" forall a. Semigroup a => a -> a -> a
<> String
s
)
instance HasMyName ArchLinuxName where
toHackageRep :: ArchLinuxName -> MyName 'HackageRep
toHackageRep = String -> MyName 'HackageRep
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArchLinuxName -> String
unArchLinuxName
where
go :: String -> MyName 'HackageRep
go String
s = case MyName 'ArchLinuxRep -> Maybe (MyName 'HackageRep)
extraToHackageP (forall k (a :: k). String -> MyName a
MyName String
s) of
Just MyName 'HackageRep
x -> MyName 'HackageRep
x
Maybe (MyName 'HackageRep)
_ -> forall k (a :: k). String -> MyName a
MyName forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
drop Int
8 String
s
toArchLinuxRep :: ArchLinuxName -> MyName 'ArchLinuxRep
toArchLinuxRep = forall k (a :: k). String -> MyName a
MyName forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArchLinuxName -> String
unArchLinuxName
mToArchLinuxName :: MyName 'ArchLinuxRep -> ArchLinuxName
mToArchLinuxName :: MyName 'ArchLinuxRep -> ArchLinuxName
mToArchLinuxName = String -> ArchLinuxName
ArchLinuxName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (a :: k). MyName a -> String
unsafeUnMyName
mToHackageName :: MyName 'HackageRep -> PackageName
mToHackageName :: MyName 'HackageRep -> PackageName
mToHackageName = String -> PackageName
mkPackageName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (a :: k). MyName a -> String
unsafeUnMyName
toArchLinuxName :: HasMyName n => n -> ArchLinuxName
toArchLinuxName :: forall n. HasMyName n => n -> ArchLinuxName
toArchLinuxName = MyName 'ArchLinuxRep -> ArchLinuxName
mToArchLinuxName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasMyName a => a -> MyName 'ArchLinuxRep
toArchLinuxRep
toHackageName :: HasMyName n => n -> PackageName
toHackageName :: forall n. HasMyName n => n -> PackageName
toHackageName = MyName 'HackageRep -> PackageName
mToHackageName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasMyName a => a -> MyName 'HackageRep
toHackageRep
isHaskellPackage :: ArchLinuxName -> Bool
isHaskellPackage :: ArchLinuxName -> Bool
isHaskellPackage (forall a. HasMyName a => a -> MyName 'ArchLinuxRep
toArchLinuxRep -> MyName 'ArchLinuxRep
rep) = MyName 'ArchLinuxRep
rep forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [MyName 'ArchLinuxRep]
extraListP Bool -> Bool -> Bool
|| String
"haskell-" forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` forall {k} (a :: k). MyName a -> String
unsafeUnMyName MyName 'ArchLinuxRep
rep
isGHCLibs :: PackageName -> Bool
isGHCLibs :: PackageName -> Bool
isGHCLibs PackageName
name = PackageName
name forall a. Eq a => a -> a -> Bool
== PackageName
"ghc" Bool -> Bool -> Bool
|| PackageName
name forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` PkgList
ghcLibList