| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
PlutusCore.DeBruijn.Internal
Description
Support for using de Bruijn indices for term and type names.
Synopsis
- newtype Index = Index Word64
- class HasIndex a where
- newtype DeBruijn = DeBruijn {}
- data NamedDeBruijn = NamedDeBruijn {
- ndbnString :: !Text
- ndbnIndex :: !Index
- newtype FakeNamedDeBruijn = FakeNamedDeBruijn {}
- newtype TyDeBruijn = TyDeBruijn DeBruijn
- newtype NamedTyDeBruijn = NamedTyDeBruijn NamedDeBruijn
- data FreeVariableError
- = FreeUnique !Unique
- | FreeIndex !Index
- newtype Level = Level Integer
- data LevelInfo = LevelInfo {
- currentLevel :: Level
- levelMapping :: Bimap Unique Level
- declareUnique :: (MonadReader LevelInfo m, HasUnique name unique) => name -> m a -> m a
- declareBinder :: (MonadReader LevelInfo m, MonadQuote m) => m a -> m a
- withScope :: MonadReader LevelInfo m => m a -> m a
- getIndex :: MonadReader LevelInfo m => Unique -> (Unique -> m Index) -> m Index
- getUnique :: MonadReader LevelInfo m => Index -> (Index -> m Unique) -> m Unique
- unNameDeBruijn :: NamedDeBruijn -> DeBruijn
- unNameTyDeBruijn :: NamedTyDeBruijn -> TyDeBruijn
- fakeNameDeBruijn :: DeBruijn -> NamedDeBruijn
- fakeTyNameDeBruijn :: TyDeBruijn -> NamedTyDeBruijn
- nameToDeBruijn :: MonadReader LevelInfo m => (Unique -> m Index) -> Name -> m NamedDeBruijn
- tyNameToDeBruijn :: MonadReader LevelInfo m => (Unique -> m Index) -> TyName -> m NamedTyDeBruijn
- deBruijnToName :: MonadReader LevelInfo m => (Index -> m Unique) -> NamedDeBruijn -> m Name
- deBruijnToTyName :: MonadReader LevelInfo m => (Index -> m Unique) -> NamedTyDeBruijn -> m TyName
- freeIndexThrow :: MonadError FreeVariableError m => Index -> m Unique
- freeIndexAsConsistentLevel :: (MonadReader LevelInfo m, MonadState (Map Level Unique) m, MonadQuote m) => Index -> m Unique
- freeUniqueThrow :: MonadError FreeVariableError m => Unique -> m Index
- runDeBruijnT :: ReaderT LevelInfo m a -> m a
- deBruijnInitIndex :: Index
- toFake :: DeBruijn -> FakeNamedDeBruijn
- fromFake :: FakeNamedDeBruijn -> DeBruijn
Documentation
A relative index used for de Bruijn identifiers.
FIXME: downside of using newtype+Num instead of type-synonym is that `-Woverflowed-literals` does not work, e.g.: `DeBruijn (-1)` has no warning. To trigger the warning you have to bypass the Num and write `DeBruijn (Index -1)`. This can be revisited when we implement PLT-1053. Tracked by: https://github.com/IntersectMBO/plutus-private/issues/1552
Instances
class HasIndex a where Source #
Instances
| HasIndex DeBruijn Source # | |
| HasIndex NamedDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
| HasIndex NamedTyDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
| HasIndex TyDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
A term name as a de Bruijn index, without the name string.
Instances
| Generic DeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Associated Types
| |||||
| Show DeBruijn Source # | |||||
| NFData DeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| Eq DeBruijn Source # | |||||
| Hashable DeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| Flat DeBruijn | |||||
| HasIndex DeBruijn Source # | |||||
| HasPrettyConfigName config => PrettyBy config DeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| Flat (Binder DeBruijn) | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term DeBruijn uni fun ann) Source # | |||||
| HashableTermConstraints uni fun ann => Hashable (Term DeBruijn uni fun ann) Source # | |||||
Defined in UntypedPlutusCore.Core.Instance.Eq | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term TyDeBruijn DeBruijn uni fun ann) Source # | |||||
Defined in PlutusCore.Core.Instance.Eq Methods (==) :: Term TyDeBruijn DeBruijn uni fun ann -> Term TyDeBruijn DeBruijn uni fun ann -> Bool Source # (/=) :: Term TyDeBruijn DeBruijn uni fun ann -> Term TyDeBruijn DeBruijn uni fun ann -> Bool Source # | |||||
| type Rep DeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
data NamedDeBruijn Source #
A term name as a de Bruijn index.
Constructors
| NamedDeBruijn | |
Fields
| |
Instances
| Generic NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Associated Types
Methods from :: NamedDeBruijn -> Rep NamedDeBruijn x Source # to :: Rep NamedDeBruijn x -> NamedDeBruijn Source # | |||||
| Read NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| Show NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| NFData NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods rnf :: NamedDeBruijn -> () Source # | |||||
| Eq NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods (==) :: NamedDeBruijn -> NamedDeBruijn -> Bool Source # (/=) :: NamedDeBruijn -> NamedDeBruijn -> Bool Source # | |||||
| Hashable NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| Flat NamedDeBruijn | |||||
Defined in PlutusCore.FlatInstances Methods encode :: NamedDeBruijn -> Encoding decode :: Get NamedDeBruijn size :: NamedDeBruijn -> NumBits -> NumBits | |||||
| HasIndex NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| HasPrettyConfigName config => PrettyBy config NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods prettyBy :: config -> NamedDeBruijn -> Doc ann # prettyListBy :: config -> [NamedDeBruijn] -> Doc ann # | |||||
| Flat (Binder NamedDeBruijn) | |||||
Defined in PlutusCore.FlatInstances Methods encode :: Binder NamedDeBruijn -> Encoding decode :: Get (Binder NamedDeBruijn) size :: Binder NamedDeBruijn -> NumBits -> NumBits | |||||
| ThrowableBuiltins uni fun => MonadError (CekEvaluationException NamedDeBruijn uni fun) (CekM uni fun s) Source # | |||||
Defined in UntypedPlutusCore.Evaluation.Machine.Cek.Internal Methods throwError :: CekEvaluationException NamedDeBruijn uni fun -> CekM uni fun s a Source # catchError :: CekM uni fun s a -> (CekEvaluationException NamedDeBruijn uni fun -> CekM uni fun s a) -> CekM uni fun s a Source # | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term NamedDeBruijn uni fun ann) Source # | |||||
Defined in UntypedPlutusCore.Core.Instance.Eq Methods (==) :: Term NamedDeBruijn uni fun ann -> Term NamedDeBruijn uni fun ann -> Bool Source # (/=) :: Term NamedDeBruijn uni fun ann -> Term NamedDeBruijn uni fun ann -> Bool Source # | |||||
| HashableTermConstraints uni fun ann => Hashable (Term NamedDeBruijn uni fun ann) Source # | |||||
Defined in UntypedPlutusCore.Core.Instance.Eq Methods hashWithSalt :: Int -> Term NamedDeBruijn uni fun ann -> Int hash :: Term NamedDeBruijn uni fun ann -> Int | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term NamedTyDeBruijn NamedDeBruijn uni fun ann) Source # | |||||
Defined in PlutusCore.Core.Instance.Eq Methods (==) :: Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Bool Source # (/=) :: Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Bool Source # | |||||
| type Rep NamedDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal type Rep NamedDeBruijn = D1 ('MetaData "NamedDeBruijn" "PlutusCore.DeBruijn.Internal" "plutus-core-1.60.0.0-LXFqBsoUlXsJIEqLytHte7" 'False) (C1 ('MetaCons "NamedDeBruijn" 'PrefixI 'True) (S1 ('MetaSel ('Just "ndbnString") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "ndbnIndex") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Index))) | |||||
newtype FakeNamedDeBruijn Source #
A wrapper around NamedDeBruijn that *must* hold the invariant of name=fakeName.
We do not export the FakeNamedDeBruijn constructor: the projection `FND->ND` is safe
but injection `ND->FND` is unsafe, thus they are not isomorphic.
See Note [Why newtype FakeNamedDeBruijn]
Constructors
| FakeNamedDeBruijn | |
Fields | |
Instances
| Show FakeNamedDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
| NFData FakeNamedDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal Methods rnf :: FakeNamedDeBruijn -> () Source # | |
| Eq FakeNamedDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal Methods (==) :: FakeNamedDeBruijn -> FakeNamedDeBruijn -> Bool Source # (/=) :: FakeNamedDeBruijn -> FakeNamedDeBruijn -> Bool Source # | |
| Hashable FakeNamedDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
| Flat FakeNamedDeBruijn | |
Defined in PlutusCore.FlatInstances Methods encode :: FakeNamedDeBruijn -> Encoding decode :: Get FakeNamedDeBruijn size :: FakeNamedDeBruijn -> NumBits -> NumBits | |
| HasPrettyConfigName config => PrettyBy config FakeNamedDeBruijn Source # | |
Defined in PlutusCore.DeBruijn.Internal Methods prettyBy :: config -> FakeNamedDeBruijn -> Doc ann # prettyListBy :: config -> [FakeNamedDeBruijn] -> Doc ann # | |
| Flat (Binder FakeNamedDeBruijn) | |
Defined in PlutusCore.FlatInstances Methods encode :: Binder FakeNamedDeBruijn -> Encoding decode :: Get (Binder FakeNamedDeBruijn) size :: Binder FakeNamedDeBruijn -> NumBits -> NumBits | |
| (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term FakeNamedDeBruijn uni fun ann) Source # | |
Defined in UntypedPlutusCore.Core.Instance.Eq Methods (==) :: Term FakeNamedDeBruijn uni fun ann -> Term FakeNamedDeBruijn uni fun ann -> Bool Source # (/=) :: Term FakeNamedDeBruijn uni fun ann -> Term FakeNamedDeBruijn uni fun ann -> Bool Source # | |
| HashableTermConstraints uni fun ann => Hashable (Term FakeNamedDeBruijn uni fun ann) Source # | |
Defined in UntypedPlutusCore.Core.Instance.Eq Methods hashWithSalt :: Int -> Term FakeNamedDeBruijn uni fun ann -> Int hash :: Term FakeNamedDeBruijn uni fun ann -> Int | |
newtype TyDeBruijn Source #
A type name as a de Bruijn index, without the name string.
Constructors
| TyDeBruijn DeBruijn |
Instances
| Generic TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Associated Types
| |||||
| Show TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| NFData TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods rnf :: TyDeBruijn -> () Source # | |||||
| Eq TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods (==) :: TyDeBruijn -> TyDeBruijn -> Bool Source # (/=) :: TyDeBruijn -> TyDeBruijn -> Bool Source # | |||||
| Wrapped TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Associated Types
Methods _Wrapped' :: Iso' TyDeBruijn (Unwrapped TyDeBruijn) | |||||
| Flat TyDeBruijn | |||||
Defined in PlutusCore.FlatInstances Methods encode :: TyDeBruijn -> Encoding decode :: Get TyDeBruijn size :: TyDeBruijn -> NumBits -> NumBits | |||||
| HasIndex TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| HasPrettyConfigName config => PrettyBy config TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods prettyBy :: config -> TyDeBruijn -> Doc ann # prettyListBy :: config -> [TyDeBruijn] -> Doc ann # | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq ann) => Eq (Type TyDeBruijn uni ann) Source # | |||||
Defined in PlutusCore.Core.Instance.Eq Methods (==) :: Type TyDeBruijn uni ann -> Type TyDeBruijn uni ann -> Bool Source # (/=) :: Type TyDeBruijn uni ann -> Type TyDeBruijn uni ann -> Bool Source # | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term TyDeBruijn DeBruijn uni fun ann) Source # | |||||
Defined in PlutusCore.Core.Instance.Eq Methods (==) :: Term TyDeBruijn DeBruijn uni fun ann -> Term TyDeBruijn DeBruijn uni fun ann -> Bool Source # (/=) :: Term TyDeBruijn DeBruijn uni fun ann -> Term TyDeBruijn DeBruijn uni fun ann -> Bool Source # | |||||
| type Rep TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal type Rep TyDeBruijn = D1 ('MetaData "TyDeBruijn" "PlutusCore.DeBruijn.Internal" "plutus-core-1.60.0.0-LXFqBsoUlXsJIEqLytHte7" 'True) (C1 ('MetaCons "TyDeBruijn" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 DeBruijn))) | |||||
| type Unwrapped TyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
newtype NamedTyDeBruijn Source #
A type name as a de Bruijn index.
Constructors
| NamedTyDeBruijn NamedDeBruijn |
Instances
| Generic NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Associated Types
Methods from :: NamedTyDeBruijn -> Rep NamedTyDeBruijn x Source # to :: Rep NamedTyDeBruijn x -> NamedTyDeBruijn Source # | |||||
| Show NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| NFData NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods rnf :: NamedTyDeBruijn -> () Source # | |||||
| Eq NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods (==) :: NamedTyDeBruijn -> NamedTyDeBruijn -> Bool Source # (/=) :: NamedTyDeBruijn -> NamedTyDeBruijn -> Bool Source # | |||||
| Wrapped NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Associated Types
Methods _Wrapped' :: Iso' NamedTyDeBruijn (Unwrapped NamedTyDeBruijn) | |||||
| Flat NamedTyDeBruijn | |||||
Defined in PlutusCore.FlatInstances Methods encode :: NamedTyDeBruijn -> Encoding decode :: Get NamedTyDeBruijn size :: NamedTyDeBruijn -> NumBits -> NumBits | |||||
| HasIndex NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| HasPrettyConfigName config => PrettyBy config NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods prettyBy :: config -> NamedTyDeBruijn -> Doc ann # prettyListBy :: config -> [NamedTyDeBruijn] -> Doc ann # | |||||
| Flat (Binder NamedTyDeBruijn) | |||||
Defined in PlutusCore.FlatInstances Methods encode :: Binder NamedTyDeBruijn -> Encoding decode :: Get (Binder NamedTyDeBruijn) size :: Binder NamedTyDeBruijn -> NumBits -> NumBits | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq ann) => Eq (Type NamedTyDeBruijn uni ann) Source # | |||||
Defined in PlutusCore.Core.Instance.Eq Methods (==) :: Type NamedTyDeBruijn uni ann -> Type NamedTyDeBruijn uni ann -> Bool Source # (/=) :: Type NamedTyDeBruijn uni ann -> Type NamedTyDeBruijn uni ann -> Bool Source # | |||||
| (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term NamedTyDeBruijn NamedDeBruijn uni fun ann) Source # | |||||
Defined in PlutusCore.Core.Instance.Eq Methods (==) :: Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Bool Source # (/=) :: Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> Bool Source # | |||||
| type Rep NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal type Rep NamedTyDeBruijn = D1 ('MetaData "NamedTyDeBruijn" "PlutusCore.DeBruijn.Internal" "plutus-core-1.60.0.0-LXFqBsoUlXsJIEqLytHte7" 'True) (C1 ('MetaCons "NamedTyDeBruijn" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 NamedDeBruijn))) | |||||
| type Unwrapped NamedTyDeBruijn Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
data FreeVariableError Source #
We cannot do a correct translation to or from de Bruijn indices if the program is not well-scoped. So we throw an error in such a case.
Constructors
| FreeUnique !Unique | |
| FreeIndex !Index |
Instances
| Exception FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods toException :: FreeVariableError -> SomeException Source # fromException :: SomeException -> Maybe FreeVariableError Source # | |||||
| Generic FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Associated Types
Methods from :: FreeVariableError -> Rep FreeVariableError x Source # to :: Rep FreeVariableError x -> FreeVariableError Source # | |||||
| Show FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| NFData FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods rnf :: FreeVariableError -> () Source # | |||||
| Eq FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods (==) :: FreeVariableError -> FreeVariableError -> Bool Source # (/=) :: FreeVariableError -> FreeVariableError -> Bool Source # | |||||
| Ord FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal Methods compare :: FreeVariableError -> FreeVariableError -> Ordering Source # (<) :: FreeVariableError -> FreeVariableError -> Bool Source # (<=) :: FreeVariableError -> FreeVariableError -> Bool Source # (>) :: FreeVariableError -> FreeVariableError -> Bool Source # (>=) :: FreeVariableError -> FreeVariableError -> Bool Source # max :: FreeVariableError -> FreeVariableError -> FreeVariableError Source # min :: FreeVariableError -> FreeVariableError -> FreeVariableError Source # | |||||
| Pretty FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal | |||||
| type Rep FreeVariableError Source # | |||||
Defined in PlutusCore.DeBruijn.Internal type Rep FreeVariableError = D1 ('MetaData "FreeVariableError" "PlutusCore.DeBruijn.Internal" "plutus-core-1.60.0.0-LXFqBsoUlXsJIEqLytHte7" 'False) (C1 ('MetaCons "FreeUnique" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Unique)) :+: C1 ('MetaCons "FreeIndex" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Index))) | |||||
An absolute level in the program.
Instances
| Enum Level Source # | |
Defined in PlutusCore.DeBruijn.Internal Methods succ :: Level -> Level Source # pred :: Level -> Level Source # toEnum :: Int -> Level Source # fromEnum :: Level -> Int Source # enumFrom :: Level -> [Level] Source # enumFromThen :: Level -> Level -> [Level] Source # enumFromTo :: Level -> Level -> [Level] Source # enumFromThenTo :: Level -> Level -> Level -> [Level] Source # | |
| Num Level Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
| Integral Level Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
| Real Level Source # | |
Defined in PlutusCore.DeBruijn.Internal Methods toRational :: Level -> Rational Source # | |
| Eq Level Source # | |
| Ord Level Source # | |
Defined in PlutusCore.DeBruijn.Internal | |
During visiting the AST we hold a reader "state" of current level and a current scoping (levelMapping). Invariant-A: the current level is positive and greater than all levels in the levelMapping. Invariant-B: only positive levels are stored in the levelMapping.
Constructors
| LevelInfo | |
Fields
| |
declareUnique :: (MonadReader LevelInfo m, HasUnique name unique) => name -> m a -> m a Source #
Declare a name with a unique, recording the mapping to a Level.
declareBinder :: (MonadReader LevelInfo m, MonadQuote m) => m a -> m a Source #
Declares a new binder by assigning a fresh unique to the *current level*.
Maintains invariant-B of LevelInfo (that only positive levels are stored),
since current level is always positive (invariant-A).
See Note [DeBruijn indices of Binders]
withScope :: MonadReader LevelInfo m => m a -> m a Source #
Enter a scope, incrementing the current Level by one
Maintains invariant-A (that the current level is positive).
nameToDeBruijn :: MonadReader LevelInfo m => (Unique -> m Index) -> Name -> m NamedDeBruijn Source #
tyNameToDeBruijn :: MonadReader LevelInfo m => (Unique -> m Index) -> TyName -> m NamedTyDeBruijn Source #
deBruijnToName :: MonadReader LevelInfo m => (Index -> m Unique) -> NamedDeBruijn -> m Name Source #
deBruijnToTyName :: MonadReader LevelInfo m => (Index -> m Unique) -> NamedTyDeBruijn -> m TyName Source #
freeIndexThrow :: MonadError FreeVariableError m => Index -> m Unique Source #
The default handler of throwing an error upon encountering a free debruijn index.
freeIndexAsConsistentLevel :: (MonadReader LevelInfo m, MonadState (Map Level Unique) m, MonadQuote m) => Index -> m Unique Source #
A different implementation of a handler, where "free" debruijn indices do not throw an error but are instead gracefully converted to fresh uniques. These generated uniques remain free; i.e. if the original term was open, it will remain open after applying this handler. These generated free uniques are consistent across the open term (by using a state cache).
freeUniqueThrow :: MonadError FreeVariableError m => Unique -> m Index Source #
The default handler of throwing an error upon encountering a free name (unique).
runDeBruijnT :: ReaderT LevelInfo m a -> m a Source #
deBruijnInitIndex :: Index Source #
The LamAbs index (for debruijn indices) and the starting level of DeBruijn monad
toFake :: DeBruijn -> FakeNamedDeBruijn Source #
fromFake :: FakeNamedDeBruijn -> DeBruijn Source #