module UHC.Light.Compiler.Gam.Base
( emptyGam, gamMap, gamLookup, gamLookupDup, gamPushNew, gamPop, gamTop, gamAddGam, gamAdd, gamPushGam, gamToAssocL, gamToAssocDupL, assocLToGam, assocDupLToGam, gamKeys
, gamSingleton, gamInsert, gamUnion, gamUnions, gamFromAssocL
, assocLToGamWithDups
, gamToOnlyDups
, gamPartition
, gamMapElts
, gamMapThr
, gamUnzip
, gamElts
, gamNoDups
, Gam
, gamLookupMetaLev
, gamMetaLevSingleton
, gamUnionWith )
where
import Data.List
import UHC.Util.Utils
import UHC.Light.Compiler.Base.HsName.Builtin
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.NameAspect
import qualified Data.Set as Set
import UHC.Light.Compiler.Opts.Base
import Data.Maybe
import qualified Data.Set as Set
import qualified Data.Map as Map
import UHC.Util.ScopeMapGam
type Gam k v = SGam k v
emptyGam :: Gam k v
gamSingleton :: k -> v -> Gam k v
gamLookup :: Ord k => k -> Gam k v -> Maybe v
gamToAssocL :: Ord k => Gam k v -> AssocL k v
gamPushNew :: Gam k v -> Gam k v
gamPushGam :: Ord k => Gam k v -> Gam k v -> Gam k v
gamPop :: Ord k => Gam k v -> (Gam k v,Gam k v)
gamAddGam :: Ord k => Gam k v -> Gam k v -> Gam k v
gamAdd :: Ord k => k -> v -> Gam k v -> Gam k v
gamLookupMetaLev :: Ord k => MetaLev -> k -> Gam k v -> Maybe v
gamLookupMetaLev mlev k g = fmap head $ gamLookupMetaLevDup mlev k g
gamToAssocL g = [ (k,v) | (k,(v:_)) <- gamToAssocDupL g ]
gamLookup k g = fmap head $ gamLookupDup k g
assocLToGam = gamUnions . map (uncurry gamSingleton)
emptyGam = emptySGam
gamSingleton = sgamSingleton
gamPushNew = sgamPushNew
gamPushGam = sgamPushGam
gamPop = sgamPop
gamAddGam = sgamUnion
gamAdd k v g = sgamUnion (sgamSingleton k v) g
gamTop :: Ord k => Gam k v -> Gam k v
assocLToGam :: Ord k => AssocL k v -> Gam k v
gamTop = sgamTop
gamMetaLevSingleton = sgamMetaLevSingleton
assocDupLToGam :: Ord k => AssocL k [v] -> Gam k v
assocDupLToGam = sgamFromAssocDupL
assocLToGamWithDups :: Ord k => AssocL k v -> Gam k v
assocLToGamWithDups = assocDupLToGam . assocLGroupSort
gamToAssocDupL :: Ord k => Gam k v -> AssocL k [v]
gamToAssocDupL = sgamToAssocDupL
gamToOnlyDups :: Ord k => Gam k v -> AssocL k [v]
gamToOnlyDups g = [ x | x@(n,(_:_:_)) <- gamToAssocDupL g ]
gamNoDups :: Ord k => Gam k v -> Gam k v
gamNoDups = sgamNoDups
gamMap :: (Ord k,Ord k') => ((k,v) -> (k',v')) -> Gam k v -> Gam k' v'
gamMap = sgamMap
gamMapElts :: Ord k => (v -> v') -> Gam k v -> Gam k v'
gamMapElts f = gamMap (\(n,v) -> (n,f v))
gamPartition :: Ord k => (k -> v -> Bool) -> Gam k v -> (Gam k v,Gam k v)
gamPartition = sgamPartitionWithKey
gamMapThr :: (Ord k,Ord k') => ((k,v) -> t -> ((k',v'),t)) -> t -> Gam k v -> (Gam k' v',t)
gamMapThr = sgamMapThr
gamKeys :: Ord k => Gam k v -> [k]
gamKeys = assocLKeys . gamToAssocL
gamElts :: Ord k => Gam k v -> [v]
gamElts = assocLElts . gamToAssocL
gamLookupMetaLevDup :: Ord k => MetaLev -> k -> Gam k v -> Maybe [v]
gamLookupMetaLevDup = sgamLookupMetaLevDup
gamLookupDup :: Ord k => k -> Gam k v -> Maybe [v]
gamLookupDup = gamLookupMetaLevDup metaLevVal
gamUnzip :: Ord k => Gam k (v1,v2) -> (Gam k v1,Gam k v2)
gamUnzip g = sgamUnzip g
gamInsert :: Ord k => k -> v -> Gam k v -> Gam k v
gamInsert = gamAdd
gamUnion :: Ord k => Gam k v -> Gam k v -> Gam k v
gamUnion = gamAddGam
gamFromAssocL :: Ord k => AssocL k v -> Gam k v
gamFromAssocL = assocLToGam
gamUnionWith :: Ord k => (v -> [v] -> [v]) -> Gam k v -> Gam k v -> Gam k v
gamUnionWith cmb = sgamUnionWith (Just cmb)
gamUnions :: Ord k => [Gam k v] -> Gam k v
gamUnions [] = emptyGam
gamUnions gs = foldr1 gamUnion gs