module UHC.Light.Compiler.CodeGen.ValAccess
( module UHC.Light.Compiler.CodeGen.BasicAnnot
, patNmL2DepL
, AltFetch (..)
, HsName2RefMp, HsName2RefMpMp
, HsName2FldMpMp, HsName2FldMp
, offMpKeysSorted, offMpMpKeysSet )
where
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Base.HsName.Builtin
import UHC.Light.Compiler.CodeGen.RefGenerator
import UHC.Util.Utils
import UHC.Util.Pretty as Pretty
import Data.Bits
import Data.Maybe
import qualified UHC.Util.FastSeq as Seq
import qualified Data.Map as Map
import qualified Data.Set as Set
import Control.Monad
import Control.Monad.State
import UHC.Light.Compiler.CodeGen.BasicAnnot

{-# LINE 126 "src/ehc/CodeGen/ValAccess.chs" #-}
-- | Generate references starting at offset 0 with additional direction tweaking
patNmL2DepL :: RefGenerator r => (Int -> Int) -> ([HsName] -> [HsName]) -> [HsName] -> AssocL HsName r
patNmL2DepL fd fl nmL = refGen 0 (fd 1) (fl nmL)

{-# LINE 136 "src/ehc/CodeGen/ValAccess.chs" #-}
type HsName2RefMp meref = Map.Map HsName meref
type HsName2RefMpMp mref meref = Map.Map HsName (mref, HsName2RefMp meref)

{-# LINE 141 "src/ehc/CodeGen/ValAccess.chs" #-}
type HsName2FldMp   = HsName2RefMp   Fld
type HsName2FldMpMp = HsName2RefMpMp Fld Fld

{-# LINE 146 "src/ehc/CodeGen/ValAccess.chs" #-}
-- | Module names, sorted on import order, which is included as 0-based offset (used as index in import entry table)
offMpKeysSorted :: (Ord mref, RefOfFld Fld mref) => HsName2FldMpMp -> AssocL HsName mref
offMpKeysSorted m = sortOn snd [ (n, refOfFld o) | (n,(o,_)) <- Map.toList m ]

offMpMpKeysSet :: HsName2RefMpMp mref meref -> HsNameS
offMpMpKeysSet m = Set.unions [ Map.keysSet m' | (_,m') <- Map.elems m ]

{-# LINE 159 "src/ehc/CodeGen/ValAccess.chs" #-}
data AltFetch lref
  = AltFetch_Many   [HsName]                -- multiple introduced names
  | AltFetch_One    HsName lref             -- single introduced name, field ref in node (excluding header)
  | AltFetch_Zero
  deriving Eq