{-# LANGUAGE DeriveGeneric #-}

module Distribution.Backpack.FullUnitId
  ( FullUnitId (..)
  , FullDb
  , expandOpenUnitId
  , expandUnitId
  ) where

import Distribution.Backpack
import Distribution.Compat.Prelude
import Distribution.Types.ComponentId

-- Unlike OpenUnitId, which could direct to a UnitId.
data FullUnitId = FullUnitId ComponentId OpenModuleSubst
  deriving (Int -> FullUnitId -> ShowS
[FullUnitId] -> ShowS
FullUnitId -> String
(Int -> FullUnitId -> ShowS)
-> (FullUnitId -> String)
-> ([FullUnitId] -> ShowS)
-> Show FullUnitId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FullUnitId -> ShowS
showsPrec :: Int -> FullUnitId -> ShowS
$cshow :: FullUnitId -> String
show :: FullUnitId -> String
$cshowList :: [FullUnitId] -> ShowS
showList :: [FullUnitId] -> ShowS
Show, (forall x. FullUnitId -> Rep FullUnitId x)
-> (forall x. Rep FullUnitId x -> FullUnitId) -> Generic FullUnitId
forall x. Rep FullUnitId x -> FullUnitId
forall x. FullUnitId -> Rep FullUnitId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FullUnitId -> Rep FullUnitId x
from :: forall x. FullUnitId -> Rep FullUnitId x
$cto :: forall x. Rep FullUnitId x -> FullUnitId
to :: forall x. Rep FullUnitId x -> FullUnitId
Generic)

type FullDb = DefUnitId -> FullUnitId

expandOpenUnitId :: FullDb -> OpenUnitId -> FullUnitId
expandOpenUnitId :: FullDb -> OpenUnitId -> FullUnitId
expandOpenUnitId FullDb
_db (IndefFullUnitId ComponentId
cid OpenModuleSubst
subst) =
  ComponentId -> OpenModuleSubst -> FullUnitId
FullUnitId ComponentId
cid OpenModuleSubst
subst
expandOpenUnitId FullDb
db (DefiniteUnitId DefUnitId
uid) =
  FullDb -> FullDb
expandUnitId FullDb
db DefUnitId
uid

expandUnitId :: FullDb -> DefUnitId -> FullUnitId
expandUnitId :: FullDb -> FullDb
expandUnitId FullDb
db DefUnitId
uid = FullDb
db DefUnitId
uid