packages feed

ddc-source-tetra-0.4.3.1: DDC/Source/Tetra/Exp/Bind.hs

module DDC.Source.Tetra.Exp.Bind
        ( Name
        , Bind          (..)
        , Bound         (..)
        , takeBoundOfBind

        , DaConBind     (..)
        , DaConBound    (..)
        , TyConBind     (..)
        , TyConBound    (..))
where
import DDC.Source.Tetra.Prim.Base
import Data.Text                (Text)

type Name = Text

-- | Binding occurrence of a variable.
data Bind
        = BNone
        | BAnon
        | BName !Text
        deriving (Eq, Ord, Show)


-- | Bound occurrence of a variable.
data Bound 
        -- A named variable.
        = UName !Text

        -- A deBruijn idex.
        | UIx   !Int

        -- A hole that we want the type checker to fill in.
        | UHole
        deriving (Eq, Ord, Show)


-- | Take the corresponding `Bound` of a `Bind`, if there is one.
takeBoundOfBind :: Bind -> Maybe Bound
takeBoundOfBind bb
 = case bb of
        BNone    -> Nothing
        BAnon    -> Just $ UIx 0
        BName tx -> Just $ UName tx


-- | Binding occurrence of a data constructor.
data DaConBind
        = DaConBindName  Text
        deriving (Eq, Ord, Show)


-- | Bound occurrences of a data constructor.
data DaConBound
        = DaConBoundName Text
        | DaConBoundLit  PrimLit
        deriving (Eq, Ord, Show)


-- | Binding occurrence of a type constructor.
data TyConBind
        = TyConBindName  Text
        deriving (Eq, Ord, Show)


-- | Bound occurrence of a type constructor.
data TyConBound
        = TyConBoundName Text
        deriving (Eq, Ord, Show)