{-# LANGUAGE CPP #-}
{-# LANGUAGE LambdaCase #-}
module GHC.Builtin.Utils (GHC(..), isKnownKeyName, lookupKnownKeyName) where

import Data.Maybe
import Control.Applicative

import GHC.Types.Unique
import GHC.Types.Unique.FM

import GHC.Builtin.Imports
import GHC.Builtin.Uniques
import GHC.Builtin.Names.GHC908 qualified as GHC908
import GHC.Builtin.Names.GHC910 qualified as GHC910
import GHC.Builtin.Names.GHC912 qualified as GHC912

data GHC =
    GHC908
  | GHC910
  | GHC912

lookupKnownKeyName :: GHC -> Unique -> Maybe Name
lookupKnownKeyName :: GHC -> Unique -> Maybe Name
lookupKnownKeyName = \ case
  GHC
GHC908 -> Unique -> Maybe Name
lookupKnownKeyName908
  GHC
GHC910 -> Unique -> Maybe Name
lookupKnownKeyName910
  GHC
GHC912 -> Unique -> Maybe Name
lookupKnownKeyName912

lookupKnownKeyName908 :: Unique -> Maybe Name
lookupKnownKeyName908 :: Unique -> Maybe Name
lookupKnownKeyName908 Unique
u = Unique -> Maybe Name
knownUniqueName Unique
u Maybe Name -> Maybe Name -> Maybe Name
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> UniqFM Name Name -> Unique -> Maybe Name
forall key elt. UniqFM key elt -> Unique -> Maybe elt
lookupUFM_Directly UniqFM Name Name
knownKeysMap908 Unique
u

lookupKnownKeyName910 :: Unique -> Maybe Name
lookupKnownKeyName910 :: Unique -> Maybe Name
lookupKnownKeyName910 Unique
u = Unique -> Maybe Name
knownUniqueName Unique
u Maybe Name -> Maybe Name -> Maybe Name
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> UniqFM Name Name -> Unique -> Maybe Name
forall key elt. UniqFM key elt -> Unique -> Maybe elt
lookupUFM_Directly UniqFM Name Name
knownKeysMap910 Unique
u

lookupKnownKeyName912 :: Unique -> Maybe Name
lookupKnownKeyName912 :: Unique -> Maybe Name
lookupKnownKeyName912 Unique
u = Unique -> Maybe Name
knownUniqueName Unique
u Maybe Name -> Maybe Name -> Maybe Name
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> UniqFM Name Name -> Unique -> Maybe Name
forall key elt. UniqFM key elt -> Unique -> Maybe elt
lookupUFM_Directly UniqFM Name Name
knownKeysMap912 Unique
u

knownKeysMap908 :: UniqFM Name Name
knownKeysMap908 :: UniqFM Name Name
knownKeysMap908 = [Name] -> UniqFM Name Name
forall key. Uniquable key => [key] -> UniqFM key key
listToIdentityUFM [Name]
GHC908.knownKeyNames

knownKeysMap910 :: UniqFM Name Name
knownKeysMap910 :: UniqFM Name Name
knownKeysMap910 = [Name] -> UniqFM Name Name
forall key. Uniquable key => [key] -> UniqFM key key
listToIdentityUFM [Name]
GHC910.knownKeyNames

knownKeysMap912 :: UniqFM Name Name
knownKeysMap912 :: UniqFM Name Name
knownKeysMap912 = [Name] -> UniqFM Name Name
forall key. Uniquable key => [key] -> UniqFM key key
listToIdentityUFM [Name]
GHC912.knownKeyNames

isKnownKeyName :: Name -> Bool
isKnownKeyName :: Name -> Bool
isKnownKeyName Name
n = Maybe Name -> Bool
forall a. Maybe a -> Bool
isJust (Unique -> Maybe Name
knownUniqueName (Unique -> Maybe Name) -> Unique -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Name -> Unique
nameUnique Name
n) Bool -> Bool -> Bool
|| Name -> UniqFM Name () -> Bool
forall key elt. Uniquable key => key -> UniqFM key elt -> Bool
elemUFM Name
n UniqFM Name ()
knownKeys

#if __GLASGOW_HASKELL__ == 908 || __GLASGOW_HASKELL__ == 910 || __GLASGOW_HASKELL__ == 912
knownKeys :: UniqFM Name ()
knownKeys :: UniqFM Name ()
knownKeys = () () -> UniqFM Name Name -> UniqFM Name ()
forall a b. a -> UniqFM Name b -> UniqFM Name a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ UniqFM Name Name
knownKeysMap908 UniqFM Name Name -> UniqFM Name Name -> UniqFM Name Name
forall a. Semigroup a => a -> a -> a
<> UniqFM Name Name
knownKeysMap910 UniqFM Name Name -> UniqFM Name Name -> UniqFM Name Name
forall a. Semigroup a => a -> a -> a
<> UniqFM Name Name
knownKeysMap912
#endif