module Data.Flags.Base ( Flags(..), BoundedFlags(..), ) where infixl 7 `commonFlags` infixl 6 `andFlags` infixl 5 `butFlags` class Eq a => Flags a where -- | The empty set of flags. noFlags :: a -- | Union of two flag sets. andFlags :: a -> a -> a -- | Difference between two flag sets. butFlags :: a -> a -> a -- | Intersection of two flag sets. commonFlags :: a -> a -> a f1 `commonFlags` f2 = (f1 `andFlags` f2) `butFlags` (f1 `butFlags` f2) `butFlags` (f2 `butFlags` f1) -- | Use this class when the set of flags is fixed and not likely -- to change in the future. class Flags a => BoundedFlags a where -- | Set of all flags. allFlags :: a -- | List the individual flags. enumFlags :: a -> [a]