module UHC.Light.Compiler.EHC.BuildFunction
( module Data.Functor.Identity
, bcacheLookup, bcacheInsert, bcacheInsertDpd )
where
import UHC.Light.Compiler.EHC.Common
import UHC.Light.Compiler.EHC.CompileUnit
import Control.Applicative
import Data.Functor.Identity
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.IntMap as IMap
import Data.Maybe
import UHC.Util.Hashable
import UHC.Util.Lens
import qualified UHC.Util.RelMap as Rel
import Data.Typeable
import UHC.Light.Compiler.EHC.CompileRun.Base
import UHC.Util.Time
import qualified UHC.Light.Compiler.HS.ModImpExp as HSSemMod
import UHC.Light.Compiler.Base.PackageDatabase
import qualified UHC.Light.Compiler.Base.Pragma as Pragma
deriving instance Typeable Identity
bcacheLookup :: (Typeable res, Typeable f, Typeable m) => BFun' m res -> BCache m -> Maybe (f res)
bcacheLookup key (BCache {_bcacheCache=cache}) = do
vals <- IMap.lookup (hash key) cache
lookup key $ catMaybes $ map cvt vals
where
cvt (BFunCacheEntry {bfceFun=f, bfceVal=v}) = case (cast f, cast v) of
(Just f', Just v') -> Just (f',v')
_ -> Nothing
bcacheInsert :: (Typeable res, Typeable f) => BFun' m res -> f res -> BCache m -> BCache m
bcacheInsert k v bc@(BCache {_bcacheCache=c}) = bc { _bcacheCache = IMap.insertWith (++) (hash k) [BFunCacheEntry k v] c }
bcacheInsertDpd
:: (Typeable res1, Typeable res2)
=>
BFun' m res1
-> BFun' m res2
-> BCache m -> BCache m
bcacheInsertDpd f1 f2 bc@(BCache {_bcacheDpdRel=dpd}) = bc { _bcacheDpdRel = Rel.insert (BFun f1) (BFun f2) dpd }