- let adjust [] as bs = return (as,bs)
- adjust (('-':m) : ms) as bs
- | m `elem` as = adjust ms (delete m as) bs
- | m `elem` bs = adjust ms as (delete m bs)
- | otherwise = throwDyn (CmdLineError ("module `" ++ m ++ "' is not currently in scope"))
- adjust (('+':m) : ms) as bs
- | m `elem` as || m `elem` bs = adjust ms as bs -- continue silently
- | otherwise = do b <- io (cmModuleIsInterpreted cmstate m)
- if b then adjust ms (m:as) bs
- else adjust ms as (m:bs)
-
- (as,bs) <- io (cmGetContext cmstate)
- (as,bs) <- adjust mods as bs
- let bs' = if null as && prel `notElem` bs then prel:bs else bs
- cmstate' <- io (cmSetContext cmstate dflags as bs')
- setGHCiState state{cmstate=cmstate'}
+ (as',bs') <- separate cms mods [] []
+
+ let as_to_add = as' \\ (as ++ bs)
+ bs_to_add = bs' \\ (as ++ bs)
+
+ cms' <- io (cmSetContext cms dflags
+ (as ++ as_to_add) (bs ++ bs_to_add))
+ setCmState cms'
+
+
+removeFromContext mods = do
+ cms <- getCmState
+ dflags <- io getDynFlags
+ (as,bs) <- io (cmGetContext cms)
+
+ (as_to_remove,bs_to_remove) <- separate cms mods [] []
+
+ let as' = as \\ (as_to_remove ++ bs_to_remove)
+ bs' = bs \\ (as_to_remove ++ bs_to_remove)
+
+ cms' <- io (cmSetContext cms dflags as' bs')
+ setCmState cms'