{-# LANGUAGE DeriveDataTypeable #-}
{- |
Module      :  ./Common/ExtSign.hs
Description :  signatures with symbol sets
Copyright   :  (c) DFKI GmbH, Uni Bremen 2002-2007
License     :  GPLv2 or higher, see LICENSE.txt
Maintainer  :  Christian.Maeder@dfki.de
Stability   :  provisional
Portability :  portable

Some functions that operate over signatures need to be extended to work over
signatures with symbol sets for every logic
-}

module Common.ExtSign where

import Data.Data
import qualified Data.Set as Set

import Common.Doc
import Common.DocUtils

{- | signatures with symbol sets.
(The Ord instance is needed for the ATC generation) -}
data ExtSign sign symbol = ExtSign
  { plainSign :: sign
  , nonImportedSymbols :: Set.Set symbol
  } deriving (Show, Read, Typeable, Data)

instance (Ord sign) => Eq (ExtSign sign symbol) where
    a == b = compare a b == EQ

instance (Ord sign) => Ord (ExtSign sign symbol) where
  compare (ExtSign s1 _) (ExtSign s2 _) = compare s1 s2

instance (Pretty sign, Pretty symbol)
    => Pretty (ExtSign sign symbol) where
  pretty (ExtSign s sys) =
    sep [pretty s, if Set.null sys then empty else pretty sys]

mkExtSign :: sign -> ExtSign sign symbol
mkExtSign s = ExtSign s Set.empty