module GHC.Unit.Home
( GenHomeUnit (..)
, HomeUnit
, homeUnitId
, homeUnitInstantiations
, homeUnitInstanceOf
, homeUnitInstanceOfMaybe
, homeUnitAsUnit
, homeUnitMap
, isHomeUnitIndefinite
, isHomeUnitDefinite
, isHomeUnitInstantiating
, isHomeUnit
, isHomeUnitId
, isHomeUnitInstanceOf
, isHomeModule
, isHomeInstalledModule
, notHomeUnitId
, notHomeModule
, notHomeModuleMaybe
, notHomeInstalledModule
, notHomeInstalledModuleMaybe
, mkHomeModule
, mkHomeInstalledModule
, homeModuleInstantiation
, homeModuleNameInstantiation
)
where
import GHC.Prelude
import GHC.Unit.Types
import Data.Maybe
import Language.Haskell.Syntax.Module.Name
data GenHomeUnit u
= DefiniteHomeUnit UnitId (Maybe (u, GenInstantiations u))
| IndefiniteHomeUnit UnitId (GenInstantiations u)
type HomeUnit = GenHomeUnit UnitId
homeUnitId :: GenHomeUnit u -> UnitId
homeUnitId :: forall u. GenHomeUnit u -> UnitId
homeUnitId (DefiniteHomeUnit UnitId
u Maybe (u, GenInstantiations u)
_) = UnitId
u
homeUnitId (IndefiniteHomeUnit UnitId
u GenInstantiations u
_) = UnitId
u
homeUnitInstantiations :: GenHomeUnit u -> GenInstantiations u
homeUnitInstantiations :: forall u. GenHomeUnit u -> GenInstantiations u
homeUnitInstantiations (DefiniteHomeUnit UnitId
_ Maybe (u, GenInstantiations u)
Nothing) = []
homeUnitInstantiations (DefiniteHomeUnit UnitId
_ (Just (u
_,GenInstantiations u
is))) = GenInstantiations u
is
homeUnitInstantiations (IndefiniteHomeUnit UnitId
_ GenInstantiations u
is) = GenInstantiations u
is
homeUnitInstanceOf :: HomeUnit -> UnitId
homeUnitInstanceOf :: HomeUnit -> UnitId
homeUnitInstanceOf HomeUnit
h = forall a. a -> Maybe a -> a
fromMaybe (forall u. GenHomeUnit u -> UnitId
homeUnitId HomeUnit
h) (forall u. GenHomeUnit u -> Maybe u
homeUnitInstanceOfMaybe HomeUnit
h)
homeUnitInstanceOfMaybe :: GenHomeUnit u -> Maybe u
homeUnitInstanceOfMaybe :: forall u. GenHomeUnit u -> Maybe u
homeUnitInstanceOfMaybe (DefiniteHomeUnit UnitId
_ (Just (u
u,GenInstantiations u
_))) = forall a. a -> Maybe a
Just u
u
homeUnitInstanceOfMaybe GenHomeUnit u
_ = forall a. Maybe a
Nothing
homeUnitAsUnit :: HomeUnit -> Unit
homeUnitAsUnit :: HomeUnit -> Unit
homeUnitAsUnit (DefiniteHomeUnit UnitId
u Maybe (UnitId, GenInstantiations UnitId)
_) = forall uid. Definite uid -> GenUnit uid
RealUnit (forall unit. unit -> Definite unit
Definite UnitId
u)
homeUnitAsUnit (IndefiniteHomeUnit UnitId
u GenInstantiations UnitId
is) = forall u.
IsUnitId u =>
u -> [(ModuleName, GenModule (GenUnit u))] -> GenUnit u
mkVirtUnit UnitId
u GenInstantiations UnitId
is
homeUnitMap :: IsUnitId v => (u -> v) -> GenHomeUnit u -> GenHomeUnit v
homeUnitMap :: forall v u.
IsUnitId v =>
(u -> v) -> GenHomeUnit u -> GenHomeUnit v
homeUnitMap u -> v
_ (DefiniteHomeUnit UnitId
u Maybe (u, GenInstantiations u)
Nothing) = forall u. UnitId -> Maybe (u, GenInstantiations u) -> GenHomeUnit u
DefiniteHomeUnit UnitId
u forall a. Maybe a
Nothing
homeUnitMap u -> v
f (DefiniteHomeUnit UnitId
u (Just (u
i,GenInstantiations u
is))) = forall u. UnitId -> Maybe (u, GenInstantiations u) -> GenHomeUnit u
DefiniteHomeUnit UnitId
u (forall a. a -> Maybe a
Just (u -> v
f u
i, forall v u.
IsUnitId v =>
(u -> v) -> GenInstantiations u -> GenInstantiations v
mapInstantiations u -> v
f GenInstantiations u
is))
homeUnitMap u -> v
f (IndefiniteHomeUnit UnitId
u GenInstantiations u
is) = forall u. UnitId -> GenInstantiations u -> GenHomeUnit u
IndefiniteHomeUnit UnitId
u (forall v u.
IsUnitId v =>
(u -> v) -> GenInstantiations u -> GenInstantiations v
mapInstantiations u -> v
f GenInstantiations u
is)
isHomeUnitIndefinite :: GenHomeUnit u -> Bool
isHomeUnitIndefinite :: forall u. GenHomeUnit u -> Bool
isHomeUnitIndefinite (DefiniteHomeUnit {}) = Bool
False
isHomeUnitIndefinite (IndefiniteHomeUnit {}) = Bool
True
isHomeUnitDefinite :: GenHomeUnit u -> Bool
isHomeUnitDefinite :: forall u. GenHomeUnit u -> Bool
isHomeUnitDefinite (DefiniteHomeUnit {}) = Bool
True
isHomeUnitDefinite (IndefiniteHomeUnit {}) = Bool
False
isHomeUnitInstantiating :: GenHomeUnit u -> Bool
isHomeUnitInstantiating :: forall u. GenHomeUnit u -> Bool
isHomeUnitInstantiating GenHomeUnit u
u =
forall u. GenHomeUnit u -> Bool
isHomeUnitDefinite GenHomeUnit u
u Bool -> Bool -> Bool
&& Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null (forall u. GenHomeUnit u -> GenInstantiations u
homeUnitInstantiations GenHomeUnit u
u))
isHomeUnit :: HomeUnit -> Unit -> Bool
isHomeUnit :: HomeUnit -> Unit -> Bool
isHomeUnit HomeUnit
hu Unit
u = Unit
u forall a. Eq a => a -> a -> Bool
== HomeUnit -> Unit
homeUnitAsUnit HomeUnit
hu
isHomeUnitId :: GenHomeUnit u -> UnitId -> Bool
isHomeUnitId :: forall u. GenHomeUnit u -> UnitId -> Bool
isHomeUnitId GenHomeUnit u
hu UnitId
uid = UnitId
uid forall a. Eq a => a -> a -> Bool
== forall u. GenHomeUnit u -> UnitId
homeUnitId GenHomeUnit u
hu
notHomeUnitId :: Maybe (GenHomeUnit u) -> UnitId -> Bool
notHomeUnitId :: forall u. Maybe (GenHomeUnit u) -> UnitId -> Bool
notHomeUnitId Maybe (GenHomeUnit u)
Nothing UnitId
_ = Bool
True
notHomeUnitId (Just GenHomeUnit u
hu) UnitId
uid = Bool -> Bool
not (forall u. GenHomeUnit u -> UnitId -> Bool
isHomeUnitId GenHomeUnit u
hu UnitId
uid)
isHomeUnitInstanceOf :: HomeUnit -> UnitId -> Bool
isHomeUnitInstanceOf :: HomeUnit -> UnitId -> Bool
isHomeUnitInstanceOf HomeUnit
hu UnitId
u = HomeUnit -> UnitId
homeUnitInstanceOf HomeUnit
hu forall a. Eq a => a -> a -> Bool
== UnitId
u
isHomeModule :: HomeUnit -> Module -> Bool
isHomeModule :: HomeUnit -> Module -> Bool
isHomeModule HomeUnit
hu Module
m = HomeUnit -> Unit -> Bool
isHomeUnit HomeUnit
hu (forall unit. GenModule unit -> unit
moduleUnit Module
m)
isHomeInstalledModule :: GenHomeUnit u -> InstalledModule -> Bool
isHomeInstalledModule :: forall u. GenHomeUnit u -> InstalledModule -> Bool
isHomeInstalledModule GenHomeUnit u
hu InstalledModule
m = forall u. GenHomeUnit u -> UnitId -> Bool
isHomeUnitId GenHomeUnit u
hu (forall unit. GenModule unit -> unit
moduleUnit InstalledModule
m)
notHomeInstalledModule :: GenHomeUnit u -> InstalledModule -> Bool
notHomeInstalledModule :: forall u. GenHomeUnit u -> InstalledModule -> Bool
notHomeInstalledModule GenHomeUnit u
hu InstalledModule
m = Bool -> Bool
not (forall u. GenHomeUnit u -> InstalledModule -> Bool
isHomeInstalledModule GenHomeUnit u
hu InstalledModule
m)
notHomeInstalledModuleMaybe :: Maybe (GenHomeUnit u) -> InstalledModule -> Bool
notHomeInstalledModuleMaybe :: forall u. Maybe (GenHomeUnit u) -> InstalledModule -> Bool
notHomeInstalledModuleMaybe Maybe (GenHomeUnit u)
mh InstalledModule
m = forall a. a -> Maybe a -> a
fromMaybe Bool
True forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall u. GenHomeUnit u -> InstalledModule -> Bool
`notHomeInstalledModule` InstalledModule
m) Maybe (GenHomeUnit u)
mh
notHomeModule :: HomeUnit -> Module -> Bool
notHomeModule :: HomeUnit -> Module -> Bool
notHomeModule HomeUnit
hu Module
m = Bool -> Bool
not (HomeUnit -> Module -> Bool
isHomeModule HomeUnit
hu Module
m)
notHomeModuleMaybe :: Maybe HomeUnit -> Module -> Bool
notHomeModuleMaybe :: Maybe HomeUnit -> Module -> Bool
notHomeModuleMaybe Maybe HomeUnit
mh Module
m = forall a. a -> Maybe a -> a
fromMaybe Bool
True forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (HomeUnit -> Module -> Bool
`notHomeModule` Module
m) Maybe HomeUnit
mh
mkHomeModule :: HomeUnit -> ModuleName -> Module
mkHomeModule :: HomeUnit -> ModuleName -> Module
mkHomeModule HomeUnit
hu = forall u. u -> ModuleName -> GenModule u
mkModule (HomeUnit -> Unit
homeUnitAsUnit HomeUnit
hu)
mkHomeInstalledModule :: GenHomeUnit u -> ModuleName -> InstalledModule
mkHomeInstalledModule :: forall u. GenHomeUnit u -> ModuleName -> InstalledModule
mkHomeInstalledModule GenHomeUnit u
hu = forall u. u -> ModuleName -> GenModule u
mkModule (forall u. GenHomeUnit u -> UnitId
homeUnitId GenHomeUnit u
hu)
homeModuleNameInstantiation :: HomeUnit -> ModuleName -> Module
homeModuleNameInstantiation :: HomeUnit -> ModuleName -> Module
homeModuleNameInstantiation HomeUnit
hu ModuleName
mod_name =
case forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup ModuleName
mod_name (forall u. GenHomeUnit u -> GenInstantiations u
homeUnitInstantiations HomeUnit
hu) of
Maybe Module
Nothing -> HomeUnit -> ModuleName -> Module
mkHomeModule HomeUnit
hu ModuleName
mod_name
Just Module
mod -> Module
mod
homeModuleInstantiation :: Maybe HomeUnit -> Module -> Module
homeModuleInstantiation :: Maybe HomeUnit -> Module -> Module
homeModuleInstantiation Maybe HomeUnit
mhu Module
mod
| Just HomeUnit
hu <- Maybe HomeUnit
mhu
, HomeUnit -> Module -> Bool
isHomeModule HomeUnit
hu Module
mod = HomeUnit -> ModuleName -> Module
homeModuleNameInstantiation HomeUnit
hu (forall unit. GenModule unit -> ModuleName
moduleName Module
mod)
| Bool
otherwise = Module
mod