{-# LANGUAGE UnicodeSyntax #-}

module Data.Flags.Base
  ( Flags(..)
  , BoundedFlags(..)
  ) where

infixl 7 `commonFlags`
infixl 6 `andFlags`
infixl 5 `butFlags`

class Eq α  Flags α where
  -- | The empty set of flags.
  noFlags  α
  -- | Union of two flag sets.
  andFlags  α -> α -> α
  -- | Difference between two flag sets.
  butFlags  α -> α -> α
  -- | Intersection of two flag sets.
  commonFlags  α -> α -> α
  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 α  BoundedFlags α where
  -- | Set of all flags.
  allFlags  α
  -- | List the individual flags.
  enumFlags  α -> [α]