    {-# LANGUAGE TypeFamilies #-}
    module Distribution.Types.TargetInfo (
        TargetInfo(..)
    ) where

    import Prelude ()
    import Distribution.Compat.Prelude

    import Distribution.Types.ComponentLocalBuildInfo
    import Distribution.Types.Component
    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 {
            targetCLBI      :: ComponentLocalBuildInfo,
            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)
        }

    instance IsNode TargetInfo where
        type Key TargetInfo = UnitId
        nodeKey       = nodeKey       . targetCLBI
        nodeNeighbors = nodeNeighbors . targetCLBI