{-|
Module      : Portage.Tables
License     : GPL-3+
Maintainer  : haskell@gentoo.org

Tables of Portage-specific conversions.
-}
module Portage.Tables
  ( set_build_slot
  ) where

import Portage.Dependency.Builder
import Portage.Dependency.Types
import Portage.PackageId

import Data.Monoid

-- | Set the @SLOT@ for a given 'Dependency'.
set_build_slot :: Dependency -> Dependency
set_build_slot :: Dependency -> Dependency
set_build_slot = 
  (Atom -> Atom) -> Dependency -> Dependency
overAtom ((Atom -> Atom) -> Dependency -> Dependency)
-> (Atom -> Atom) -> Dependency -> Dependency
forall a b. (a -> b) -> a -> b
$ \a :: Atom
a@(Atom PackageName
pn DRange
dr (DAttr SlotDepend
_ [UseFlag]
u)) -> 
      case [First SlotDepend] -> First SlotDepend
forall a. Monoid a => [a] -> a
mconcat ([First SlotDepend] -> First SlotDepend)
-> [First SlotDepend] -> First SlotDepend
forall a b. (a -> b) -> a -> b
$ ((PackageName, SlotDepend) -> First SlotDepend)
-> [(PackageName, SlotDepend)] -> [First SlotDepend]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe SlotDepend -> First SlotDepend
forall a. Maybe a -> First a
First (Maybe SlotDepend -> First SlotDepend)
-> ((PackageName, SlotDepend) -> Maybe SlotDepend)
-> (PackageName, SlotDepend)
-> First SlotDepend
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Atom -> (PackageName, SlotDepend) -> Maybe SlotDepend
forall a. Atom -> (PackageName, a) -> Maybe a
matches Atom
a) [(PackageName, SlotDepend)]
slottedPkgs of
          First (Just SlotDepend
s) -> PackageName -> DRange -> DAttr -> Atom
Atom PackageName
pn DRange
dr (SlotDepend -> [UseFlag] -> DAttr
DAttr SlotDepend
s [UseFlag]
u)
          First Maybe SlotDepend
Nothing  -> PackageName -> DRange -> DAttr -> Atom
Atom PackageName
pn DRange
dr (SlotDepend -> [UseFlag] -> DAttr
DAttr SlotDepend
AnyBuildTimeSlot [UseFlag]
u)
    where
      matches :: Atom -> (PackageName, a) -> Maybe a
matches (Atom PackageName
pn DRange
_ DAttr
_) (PackageName
nm,a
s) 
        | PackageName
pn PackageName -> PackageName -> Bool
forall a. Eq a => a -> a -> Bool
== PackageName
nm  = a -> Maybe a
forall a. a -> Maybe a
Just a
s
        | Bool
otherwise = Maybe a
forall a. Maybe a
Nothing

-- | List of 'PackageName's with their corresponding default 'SlotDepend's.
--
-- For example, dependency @QuickCheck@ has its @SLOT@ always set to @2@.
slottedPkgs :: [(PackageName, SlotDepend)]
slottedPkgs :: [(PackageName, SlotDepend)]
slottedPkgs =
  [ (String -> String -> PackageName
mkPackageName String
"dev-haskell" String
"quickcheck", String -> SlotDepend
GivenSlot String
"2=")
  , (String -> String -> PackageName
mkPackageName String
"dev-haskell" String
"hdbc", String -> SlotDepend
GivenSlot String
"2=")
  ]