{-# LANGUAGE DeriveAnyClass             #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE DerivingStrategies         #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Package.C.Db.Type ( BuildCfg (..)
                         , InstallDb (..)
                         -- * Lenses
                         , installedPackages
                         ) where

import           CPkgPrelude
import           Data.Semigroup
import qualified Data.Set       as S
import qualified Data.Text      as T
import           Package.C.Type

-- TODO: we definitely want something different here - it should allow garbage
-- collection, for one
newtype InstallDb = InstallDb { InstallDb -> Set BuildCfg
_installedPackages :: S.Set BuildCfg }
    deriving newtype (NonEmpty InstallDb -> InstallDb
InstallDb -> InstallDb -> InstallDb
(InstallDb -> InstallDb -> InstallDb)
-> (NonEmpty InstallDb -> InstallDb)
-> (forall b. Integral b => b -> InstallDb -> InstallDb)
-> Semigroup InstallDb
forall b. Integral b => b -> InstallDb -> InstallDb
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: InstallDb -> InstallDb -> InstallDb
<> :: InstallDb -> InstallDb -> InstallDb
$csconcat :: NonEmpty InstallDb -> InstallDb
sconcat :: NonEmpty InstallDb -> InstallDb
$cstimes :: forall b. Integral b => b -> InstallDb -> InstallDb
stimes :: forall b. Integral b => b -> InstallDb -> InstallDb
Semigroup, Semigroup InstallDb
InstallDb
Semigroup InstallDb =>
InstallDb
-> (InstallDb -> InstallDb -> InstallDb)
-> ([InstallDb] -> InstallDb)
-> Monoid InstallDb
[InstallDb] -> InstallDb
InstallDb -> InstallDb -> InstallDb
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: InstallDb
mempty :: InstallDb
$cmappend :: InstallDb -> InstallDb -> InstallDb
mappend :: InstallDb -> InstallDb -> InstallDb
$cmconcat :: [InstallDb] -> InstallDb
mconcat :: [InstallDb] -> InstallDb
Monoid, Get InstallDb
[InstallDb] -> Put
InstallDb -> Put
(InstallDb -> Put)
-> Get InstallDb -> ([InstallDb] -> Put) -> Binary InstallDb
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
$cput :: InstallDb -> Put
put :: InstallDb -> Put
$cget :: Get InstallDb
get :: Get InstallDb
$cputList :: [InstallDb] -> Put
putList :: [InstallDb] -> Put
Binary)

installedPackages :: Lens' InstallDb (S.Set BuildCfg)
installedPackages :: Lens' InstallDb (Set BuildCfg)
installedPackages Set BuildCfg -> f (Set BuildCfg)
f InstallDb
s = (Set BuildCfg -> InstallDb) -> f (Set BuildCfg) -> f InstallDb
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Set BuildCfg
x -> InstallDb
s { _installedPackages = x }) (Set BuildCfg -> f (Set BuildCfg)
f (InstallDb -> Set BuildCfg
_installedPackages InstallDb
s))

data BuildCfg = BuildCfg { BuildCfg -> String
buildName       :: String
                         , BuildCfg -> Version
buildVersion    :: Version
                         , BuildCfg -> [(Text, Version)]
pinnedBuildDeps :: [(T.Text, Version)]
                         , BuildCfg -> [(Text, Version)]
pinnedDeps      :: [(T.Text, Version)]
                         , BuildCfg -> Maybe TargetTriple
targetArch      :: Maybe TargetTriple
                         , BuildCfg -> Bool
global          :: Bool
                         , BuildCfg -> [Command]
configureCmds   :: [ Command ]
                         , BuildCfg -> [Command]
buildCmds       :: [ Command ]
                         , BuildCfg -> [Command]
installCmds     :: [ Command ]
                         -- , tarball         :: FilePath
                         , BuildCfg -> Bool
manual          :: Bool -- ^ Was this package manually installed?
                         } deriving (BuildCfg -> BuildCfg -> Bool
(BuildCfg -> BuildCfg -> Bool)
-> (BuildCfg -> BuildCfg -> Bool) -> Eq BuildCfg
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildCfg -> BuildCfg -> Bool
== :: BuildCfg -> BuildCfg -> Bool
$c/= :: BuildCfg -> BuildCfg -> Bool
/= :: BuildCfg -> BuildCfg -> Bool
Eq, Eq BuildCfg
Eq BuildCfg =>
(BuildCfg -> BuildCfg -> Ordering)
-> (BuildCfg -> BuildCfg -> Bool)
-> (BuildCfg -> BuildCfg -> Bool)
-> (BuildCfg -> BuildCfg -> Bool)
-> (BuildCfg -> BuildCfg -> Bool)
-> (BuildCfg -> BuildCfg -> BuildCfg)
-> (BuildCfg -> BuildCfg -> BuildCfg)
-> Ord BuildCfg
BuildCfg -> BuildCfg -> Bool
BuildCfg -> BuildCfg -> Ordering
BuildCfg -> BuildCfg -> BuildCfg
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 :: BuildCfg -> BuildCfg -> Ordering
compare :: BuildCfg -> BuildCfg -> Ordering
$c< :: BuildCfg -> BuildCfg -> Bool
< :: BuildCfg -> BuildCfg -> Bool
$c<= :: BuildCfg -> BuildCfg -> Bool
<= :: BuildCfg -> BuildCfg -> Bool
$c> :: BuildCfg -> BuildCfg -> Bool
> :: BuildCfg -> BuildCfg -> Bool
$c>= :: BuildCfg -> BuildCfg -> Bool
>= :: BuildCfg -> BuildCfg -> Bool
$cmax :: BuildCfg -> BuildCfg -> BuildCfg
max :: BuildCfg -> BuildCfg -> BuildCfg
$cmin :: BuildCfg -> BuildCfg -> BuildCfg
min :: BuildCfg -> BuildCfg -> BuildCfg
Ord, (forall x. BuildCfg -> Rep BuildCfg x)
-> (forall x. Rep BuildCfg x -> BuildCfg) -> Generic BuildCfg
forall x. Rep BuildCfg x -> BuildCfg
forall x. BuildCfg -> Rep BuildCfg x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildCfg -> Rep BuildCfg x
from :: forall x. BuildCfg -> Rep BuildCfg x
$cto :: forall x. Rep BuildCfg x -> BuildCfg
to :: forall x. Rep BuildCfg x -> BuildCfg
Generic, Get BuildCfg
[BuildCfg] -> Put
BuildCfg -> Put
(BuildCfg -> Put)
-> Get BuildCfg -> ([BuildCfg] -> Put) -> Binary BuildCfg
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
$cput :: BuildCfg -> Put
put :: BuildCfg -> Put
$cget :: Get BuildCfg
get :: Get BuildCfg
$cputList :: [BuildCfg] -> Put
putList :: [BuildCfg] -> Put
Binary, Eq BuildCfg
Eq BuildCfg =>
(Int -> BuildCfg -> Int) -> (BuildCfg -> Int) -> Hashable BuildCfg
Int -> BuildCfg -> Int
BuildCfg -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
$chashWithSalt :: Int -> BuildCfg -> Int
hashWithSalt :: Int -> BuildCfg -> Int
$chash :: BuildCfg -> Int
hash :: BuildCfg -> Int
Hashable)