{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeFamilies #-}

module Distribution.Types.TargetInfo
  ( TargetInfo (..)
  ) where

import Distribution.Compat.Prelude
import Prelude ()

import Distribution.Types.Component
import Distribution.Types.ComponentLocalBuildInfo
import Distribution.Types.UnitId

import Distribution.Compat.Graph (IsNode (..))

-- | The 'TargetInfo' contains all the information necessary to build a
-- specific target (e.g., component/module/file) in a package.  In
-- principle, one can get the 'Component' from a
-- 'ComponentLocalBuildInfo' and 'LocalBuildInfo', but it is much more
-- convenient to have the component in hand.
data TargetInfo = TargetInfo
  { TargetInfo -> ComponentLocalBuildInfo
targetCLBI :: ComponentLocalBuildInfo
  , TargetInfo -> Component
targetComponent :: Component
  -- TODO: BuildTargets supporting parsing these is dumb,
  -- we don't have support for compiling single modules or
  -- file paths. Accommodating it now is premature
  -- generalization.  Figure it out later.
  -- targetSub       :: Maybe (Either ModuleName FilePath)
  }
  deriving ((forall x. TargetInfo -> Rep TargetInfo x)
-> (forall x. Rep TargetInfo x -> TargetInfo) -> Generic TargetInfo
forall x. Rep TargetInfo x -> TargetInfo
forall x. TargetInfo -> Rep TargetInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TargetInfo -> Rep TargetInfo x
from :: forall x. TargetInfo -> Rep TargetInfo x
$cto :: forall x. Rep TargetInfo x -> TargetInfo
to :: forall x. Rep TargetInfo x -> TargetInfo
Generic, Int -> TargetInfo -> ShowS
[TargetInfo] -> ShowS
TargetInfo -> String
(Int -> TargetInfo -> ShowS)
-> (TargetInfo -> String)
-> ([TargetInfo] -> ShowS)
-> Show TargetInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TargetInfo -> ShowS
showsPrec :: Int -> TargetInfo -> ShowS
$cshow :: TargetInfo -> String
show :: TargetInfo -> String
$cshowList :: [TargetInfo] -> ShowS
showList :: [TargetInfo] -> ShowS
Show)

instance Binary TargetInfo
instance Structured TargetInfo

instance IsNode TargetInfo where
  type Key TargetInfo = UnitId
  nodeKey :: TargetInfo -> Key TargetInfo
nodeKey = ComponentLocalBuildInfo -> UnitId
ComponentLocalBuildInfo -> Key ComponentLocalBuildInfo
forall a. IsNode a => a -> Key a
nodeKey (ComponentLocalBuildInfo -> UnitId)
-> (TargetInfo -> ComponentLocalBuildInfo) -> TargetInfo -> UnitId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TargetInfo -> ComponentLocalBuildInfo
targetCLBI
  nodeNeighbors :: TargetInfo -> [Key TargetInfo]
nodeNeighbors = ComponentLocalBuildInfo -> [UnitId]
ComponentLocalBuildInfo -> [Key ComponentLocalBuildInfo]
forall a. IsNode a => a -> [Key a]
nodeNeighbors (ComponentLocalBuildInfo -> [UnitId])
-> (TargetInfo -> ComponentLocalBuildInfo)
-> TargetInfo
-> [UnitId]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TargetInfo -> ComponentLocalBuildInfo
targetCLBI