{- |
    Module      :  $Header$
    Description :  Environment of module aliases
    Copyright   :  (c) 2002 - 2004, Wolfgang Lux
                       2011 - 2013, Björn Peemöller
    License     :  BSD-3-clause

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

    This module provides an environment for resolving module aliases.

    For example, if module @FiniteMap@ is imported via

    @import FiniteMap as FM@

    then @FM@ is an alias for @FiniteMap@, and @FiniteMap@ is aliased by @FM@.
-}
module Env.ModuleAlias ( AliasEnv, initAliasEnv, importAliases ) where

import qualified Data.Map   as Map (Map, empty, insert)
import           Data.Maybe        (fromMaybe)

import Curry.Base.Ident (ModuleIdent)
import Curry.Syntax     (ImportDecl (..))

-- |Mapping from the original name of an imported module to its alias.
type AliasEnv = Map.Map ModuleIdent ModuleIdent

-- |Initial alias environment
initAliasEnv :: AliasEnv
initAliasEnv :: AliasEnv
initAliasEnv = AliasEnv
forall k a. Map k a
Map.empty

-- |Create an alias environment from a list of import declarations
importAliases :: [ImportDecl] -> AliasEnv
importAliases :: [ImportDecl] -> AliasEnv
importAliases = (ImportDecl -> AliasEnv -> AliasEnv)
-> AliasEnv -> [ImportDecl] -> AliasEnv
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ImportDecl -> AliasEnv -> AliasEnv
bindAlias AliasEnv
initAliasEnv

-- |Bind an alias for a module from a single import declaration
bindAlias :: ImportDecl -> AliasEnv -> AliasEnv
bindAlias :: ImportDecl -> AliasEnv -> AliasEnv
bindAlias (ImportDecl _ mid :: ModuleIdent
mid _ alias :: Maybe ModuleIdent
alias _) = ModuleIdent -> ModuleIdent -> AliasEnv -> AliasEnv
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert ModuleIdent
mid (ModuleIdent -> AliasEnv -> AliasEnv)
-> ModuleIdent -> AliasEnv -> AliasEnv
forall a b. (a -> b) -> a -> b
$ ModuleIdent -> Maybe ModuleIdent -> ModuleIdent
forall a. a -> Maybe a -> a
fromMaybe ModuleIdent
mid Maybe ModuleIdent
alias