{- |
    Module      :  $Header$
    Description :  Environment of instances
    Copyright   :  (c) 2016 - 2020 Finn Teegen
    License     :  BSD-3-clause

    Maintainer  :  fte@informatik.uni-kiel.de
    Stability   :  experimental
    Portability :  portable

    The compiler maintains information about defined instances in an
    environment that maps pairs of type classes and type constructors
    to the name of the module where the instance is declared, the context
    as given in the instance declaration, and a list of the class methods
    implemented in the specific instance along with their arity. A flat
    environment is sufficient because instances are visible globally and
    cannot be hidden. Instances are recorded only with the original names
    of the type class and type constructor involved. The context also uses
    original names and is already minimized.
-}

module Env.Instance
  ( InstIdent, ppInstIdent, InstInfo
  , InstEnv, initInstEnv, bindInstInfo, removeInstInfo, lookupInstInfo
  ) where

import qualified Data.Map as Map (Map, empty, insert, delete, lookup)

import Curry.Base.Ident
import Curry.Base.Pretty
import Curry.Syntax.Pretty

import Base.Types

type InstIdent = (QualIdent, QualIdent)

ppInstIdent :: InstIdent -> Doc
ppInstIdent (qcls, qtc) = ppQIdent qcls <+> ppQIdent qtc

type InstInfo = (ModuleIdent, PredSet, [(Ident, Int)])

type InstEnv = Map.Map InstIdent InstInfo

initInstEnv :: InstEnv
initInstEnv = Map.empty

bindInstInfo :: InstIdent -> InstInfo -> InstEnv -> InstEnv
bindInstInfo = Map.insert

removeInstInfo  :: InstIdent -> InstEnv -> InstEnv
removeInstInfo = Map.delete

lookupInstInfo :: InstIdent -> InstEnv -> Maybe InstInfo
lookupInstInfo = Map.lookup
