module ModuleSet where

import qualified Language.Haskell.Exts.Syntax as Syntax

import qualified Data.Set as Set
import Data.Set (Set, )


data T =
     Content (Set Syntax.ModuleName)
   | Complement (Set Syntax.ModuleName)


fromSet :: Set Syntax.ModuleName -> T
fromSet = Content

full :: T
full = Complement Set.empty


member :: Syntax.ModuleName -> T -> Bool
member modu (Content set) = Set.member modu set
member modu (Complement set) = not $ Set.member modu set


insert :: Syntax.ModuleName -> T -> T
insert modu (Content set) = Content $ Set.insert modu set
insert modu (Complement set) = Complement $ Set.delete modu set

delete :: Syntax.ModuleName -> T -> T
delete modu (Content set) = Content $ Set.delete modu set
delete modu (Complement set) = Complement $ Set.insert modu set


insertSet :: Set Syntax.ModuleName -> T -> T
insertSet new (Content set) = Content $ Set.union new set
insertSet new (Complement set) = Complement $ Set.difference set new

deleteSet :: Set Syntax.ModuleName -> T -> T
deleteSet new (Content set) = Content $ Set.difference set new
deleteSet new (Complement set) = Complement $ Set.union new set