packages feed

descript-lang-0.2.0.0: src/Descript/BasicInj/Data/Atom/Scope.hs

{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}

module Descript.BasicInj.Data.Atom.Scope
  ( FSymbol (..)
  , codeFSym
  , undefinedFSym
  ) where

import Descript.Lex.Data.Atom
import Descript.Misc

-- | A symbol with a file scope.
data FSymbol an
  = FSymbol
  { fsymbolScope :: AbsScope
  , fsymbol :: Symbol an
  } deriving (Eq, Ord, Read, Show, Functor, Foldable, Traversable)

instance Ann FSymbol where
  getAnn = getAnn . fsymbol

instance EAnn FSymbol where
  FSymbol xScope xSym `eappend` FSymbol yScope ySym
    | xScope /= yScope = error "symbols' scopes not equal"
    | otherwise = FSymbol xScope $ xSym `eappend` ySym

instance Printable FSymbol where
  aprint = aprint . fsymbol

instance (Show an) => Summary (FSymbol an) where
  summary = pprintSummary

-- | The record head for code blocks.
codeFSym :: FSymbol ()
codeFSym
  = FSymbol
  { fsymbolScope = baseScope
  , fsymbol = codeSym
  }

-- | A symbol for an undefined value - e.g. an unresolved implicit
-- property.
undefinedFSym :: FSymbol ()
undefinedFSym
  = FSymbol
  { fsymbolScope = undefinedScope
  , fsymbol = undefinedSym
  }