-- | Names used in code generation
--
-- Intended for unqualified.
module Data.Record.Anon.Internal.Plugin.Source.Names (
    -- * large-anon
    LargeAnonNames(..)
  , largeAnonNames
    -- * typelet
  , typelet_castEqual
  ) where

import Data.Record.Anon.Internal.Plugin.Source.GhcShim
import Data.Record.Anon.Internal.Plugin.Source.Options (Mode(..))

{-------------------------------------------------------------------------------
  large-anon
-------------------------------------------------------------------------------}

-- | Named required for code generation
--
-- All names are expected to be qualified with the full module name
data LargeAnonNames = LargeAnonNames {
      LargeAnonNames -> RdrName
largeAnon_empty        :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_insert       :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_applyPending :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_letRecordT   :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_letInsertAs  :: RdrName
    }

largeAnonNames :: Mode -> LargeAnonNames
largeAnonNames :: Mode -> LargeAnonNames
largeAnonNames Mode
mode = LargeAnonNames :: RdrName
-> RdrName -> RdrName -> RdrName -> RdrName -> LargeAnonNames
LargeAnonNames {
      largeAnon_empty :: RdrName
largeAnon_empty        = ModuleName -> OccName -> RdrName
mkRdrQual ModuleName
modl (OccName -> RdrName) -> OccName -> RdrName
forall a b. (a -> b) -> a -> b
$ String -> OccName
mkVarOcc String
"empty"
    , largeAnon_insert :: RdrName
largeAnon_insert       = ModuleName -> OccName -> RdrName
mkRdrQual ModuleName
modl (OccName -> RdrName) -> OccName -> RdrName
forall a b. (a -> b) -> a -> b
$ String -> OccName
mkVarOcc String
"insert"
    , largeAnon_applyPending :: RdrName
largeAnon_applyPending = ModuleName -> OccName -> RdrName
mkRdrQual ModuleName
modl (OccName -> RdrName) -> OccName -> RdrName
forall a b. (a -> b) -> a -> b
$ String -> OccName
mkVarOcc String
"applyPending"
    , largeAnon_letRecordT :: RdrName
largeAnon_letRecordT   = ModuleName -> OccName -> RdrName
mkRdrQual ModuleName
modl (OccName -> RdrName) -> OccName -> RdrName
forall a b. (a -> b) -> a -> b
$ String -> OccName
mkVarOcc String
"letRecordT"
    , largeAnon_letInsertAs :: RdrName
largeAnon_letInsertAs  = ModuleName -> OccName -> RdrName
mkRdrQual ModuleName
modl (OccName -> RdrName) -> OccName -> RdrName
forall a b. (a -> b) -> a -> b
$ String -> OccName
mkVarOcc String
"letInsertAs"
    }
  where
    modl :: ModuleName
    modl :: ModuleName
modl = case Mode
mode of
             Mode
Simple   -> String -> ModuleName
mkModuleName String
"Data.Record.Anon.Simple"
             Mode
Advanced -> String -> ModuleName
mkModuleName String
"Data.Record.Anon.Advanced"

{-------------------------------------------------------------------------------
  Typelet
-------------------------------------------------------------------------------}

typelet :: ModuleName
typelet :: ModuleName
typelet = String -> ModuleName
mkModuleName String
"TypeLet"

typelet_castEqual :: RdrName
typelet_castEqual :: RdrName
typelet_castEqual = ModuleName -> OccName -> RdrName
mkRdrQual ModuleName
typelet (OccName -> RdrName) -> OccName -> RdrName
forall a b. (a -> b) -> a -> b
$ String -> OccName
mkVarOcc String
"castEqual"