content: -- |
  -- Module      :  Disco.Extensions
  -- Copyright   :  disco team and contributors
  -- Maintainer  :  byorgey@gmail.com
  --
  -- SPDX-License-Identifier: BSD-3-Clause
  --
  -- Optional extensions to the disco language.
  module Disco.Extensions (
    Ext (..),
    ExtSet,
    defaultExts,
    allExts,
    allExtsList,
    addExtension,
  )
  where
  
  import Data.Set (Set)
  import qualified Data.Set as S
  
  type ExtSet = Set Ext
  
  -- | Enumeration of optional language extensions.
  data Ext
    = -- | Allow primitives, i.e. @$prim@
      Primitives
    | -- | Don't automatically import standard library modules
      NoStdLib
    | -- | Allow randomness.  This is not implemented yet.
      Randomness
    deriving (Eq, Ord, Show, Read, Enum, Bounded)
  
  -- | The default set of language extensions (currently, the empty set).
  defaultExts :: ExtSet
  defaultExts = S.empty
  
  -- | A set of all possible language extensions, provided for convenience.
  allExts :: ExtSet
  allExts = S.fromList allExtsList
  
  -- | All possible language extensions in the form of a list.
  allExtsList :: [Ext]
  allExtsList = [minBound .. maxBound]
  
  -- | Add an extension to an extension set.
  addExtension :: Ext -> ExtSet -> ExtSet
  addExtension = S.insert
  