plutus-core-1.60.0.0: Language library for Plutus Core
Safe HaskellSafe-Inferred
LanguageHaskell2010

PlutusCore.DeBruijn

Description

Support for using de Bruijn indices for term and type names.

Synopsis}
  • data FakeNamedDeBruijn
  • newtype TyDeBruijn = TyDeBruijn DeBruijn
  • newtype NamedTyDeBruijn = NamedTyDeBruijn NamedDeBruijn
  • data FreeVariableError
  • unNameDeBruijn :: NamedDeBruijn -> DeBruijn
  • unNameTyDeBruijn :: NamedTyDeBruijn -> TyDeBruijn
  • fakeNameDeBruijn :: DeBruijn -> NamedDeBruijn
  • fakeTyNameDeBruijn :: TyDeBruijn -> NamedTyDeBruijn
  • deBruijnTy :: MonadError FreeVariableError m => Type TyName uni ann -> m (Type NamedTyDeBruijn uni ann)
  • deBruijnTerm :: MonadError FreeVariableError m => Term TyName Name uni fun ann -> m (Term NamedTyDeBruijn NamedDeBruijn uni fun ann)
  • unDeBruijnTy :: (MonadQuote m, MonadError FreeVariableError m) => Type NamedTyDeBruijn uni ann -> m (Type TyName uni ann)
  • unDeBruijnTerm :: (MonadQuote m, MonadError FreeVariableError m) => Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> m (Term TyName Name uni fun ann)
  • deBruijnTyWith :: Monad m => (Unique -> ReaderT LevelInfo m Index) -> Type TyName uni ann -> m (Type NamedTyDeBruijn uni ann)
  • deBruijnTermWith :: Monad m => (Unique -> ReaderT LevelInfo m Index) -> Term TyName Name uni fun ann -> m (Term NamedTyDeBruijn NamedDeBruijn uni fun ann)
  • unDeBruijnTyWith :: MonadQuote m => (Index -> ReaderT LevelInfo m Unique) -> Type NamedTyDeBruijn uni ann -> m (Type TyName uni ann)
  • unDeBruijnTermWith :: MonadQuote m => (Index -> ReaderT LevelInfo m Unique) -> Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> m (Term TyName Name uni fun ann)
  • freeIndexAsConsistentLevel :: (MonadReader LevelInfo m, MonadState (Map Level Unique) m, MonadQuote m) => Index -> m Unique
  • deBruijnInitIndex :: Index
  • fromFake :: FakeNamedDeBruijn -> DeBruijn
  • toFake :: DeBruijn -> FakeNamedDeBruijn
  • Documentation

    newtype Index #

    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

    Constructors

    Index Word64 

    Instances

    Instances details
    NumBits #

    Pretty Index # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Methods

    pretty :: Index -> Doc ann #

    prettyList :: [Index] -> Doc ann #

    type Rep Index # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    type Rep Index = D1 ('MetaData "Index" "PlutusCore.DeBruijn.Internal" "plutus-core-1.60.0.0-inplace" 'True) (C1 ('MetaCons "Index" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word64)))

    newtype Level #

    An absolute level in the program.

    Constructors

    Level Integer 

    Instances

    Instances details
    Enum Level # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Num Level # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Integral Level # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Real Level # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Methods

    toRational :: Level -> Rational #

    Eq Level # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Methods

    (==) :: Level -> Level -> Bool #

    (/=) :: Level -> Level -> Bool #

    Ord Level # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Methods

    compare :: Level -> Level -> Ordering #

    (<) :: Level -> Level -> Bool #

    (<=) :: Level -> Level -> Bool #

    (>) :: Level -> Level -> Bool #

    (>=) :: Level -> Level -> Bool #

    max :: Level -> Level -> Level #

    min :: Level -> Level -> Level #

    data LevelInfo #

    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 

    class HasIndex a where #

    Methods

    index :: Lens' a Index #

    Instances

    Instances details
    HasIndex DeBruijn # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    HasIndex NamedDeBruijn # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    HasIndex NamedTyDeBruijn # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    HasIndex TyDeBruijn # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    newtype DeBruijn #

    A term name as a de Bruijn index, without the name string.

    Constructors

    DeBruijn 

    Fields

    Instances

    Instances details
    Generic DeBruijn # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Associated Types

    type Text) :*: S1 ('MetaSel ('Just "ndbnIndex") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Index)))

    data FakeNamedDeBruijn #

    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]

    Instances

    Instances details
    NumBits #

    (GEq uni, Closed uni, Everywhere uni Eq, Eq ann) => Eq (Type NamedTyDeBruijn uni ann) # 
    Instance details

    Defined in PlutusCore.Core.Instance.Eq

    Methods

    (==) :: Type NamedTyDeBruijn uni ann -> Type NamedTyDeBruijn uni ann -> Bool #

    (/=) :: Type NamedTyDeBruijn uni ann -> Type NamedTyDeBruijn uni ann -> Bool #

    (GEq uni, Closed uni, Everywhere uni Eq, Eq fun, Eq ann) => Eq (Term NamedTyDeBruijn NamedDeBruijn uni fun ann) # 
    Instance details

    Defined in PlutusCore.Core.Instance.Eq

    type Rep NamedTyDeBruijn # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    type Rep NamedTyDeBruijn = D1 ('MetaData "NamedTyDeBruijn" "PlutusCore.DeBruijn.Internal" "plutus-core-1.60.0.0-inplace" 'True) (C1 ('MetaCons "NamedTyDeBruijn" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 NamedDeBruijn)))
    type Unwrapped NamedTyDeBruijn # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    type Unwrapped NamedTyDeBruijn = GUnwrapped (Rep NamedTyDeBruijn)

    data FreeVariableError #

    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

    Instances details
    Exception FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Generic FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Associated Types

    type Rep FreeVariableError :: Type -> Type #

    Show FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    NFData FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Methods

    rnf :: FreeVariableError -> () #

    Eq FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Ord FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    Pretty FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    type Rep FreeVariableError # 
    Instance details

    Defined in PlutusCore.DeBruijn.Internal

    type Rep FreeVariableError = D1 ('MetaData "FreeVariableError" "PlutusCore.DeBruijn.Internal" "plutus-core-1.60.0.0-inplace" '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)))

    deBruijnTy :: MonadError FreeVariableError m => Type TyName uni ann -> m (Type NamedTyDeBruijn uni ann) #

    Convert a Kind with TyNames into a Kind with NamedTyDeBruijns. Will throw an error if a free variable is encountered.

    deBruijnTerm :: MonadError FreeVariableError m => Term TyName Name uni fun ann -> m (Term NamedTyDeBruijn NamedDeBruijn uni fun ann) #

    Convert a Term with TyNames and Names into a Term with NamedTyDeBruijns and NamedDeBruijns. Will throw an error if a free variable is encountered.

    unDeBruijnTy :: (MonadQuote m, MonadError FreeVariableError m) => Type NamedTyDeBruijn uni ann -> m (Type TyName uni ann) #

    Convert a Kind with NamedTyDeBruijns into a Kind with TyNames. Will throw an error if a free variable is encountered.

    unDeBruijnTerm :: (MonadQuote m, MonadError FreeVariableError m) => Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> m (Term TyName Name uni fun ann) #

    Convert a Term with NamedTyDeBruijns and NamedDeBruijns into a Term with TyNames and Names. Will throw an error if a free variable is encountered.

    unsafe api, use with care

    deBruijnTyWith :: Monad m => (Unique -> ReaderT LevelInfo m Index) -> Type TyName uni ann -> m (Type NamedTyDeBruijn uni ann) #

    unDeBruijnTyWith :: MonadQuote m => (Index -> ReaderT LevelInfo m Unique) -> Type NamedTyDeBruijn uni ann -> m (Type TyName uni ann) #

    Takes a "handler" function to execute when encountering free variables.

    unDeBruijnTermWith :: MonadQuote m => (Index -> ReaderT LevelInfo m Unique) -> Term NamedTyDeBruijn NamedDeBruijn uni fun ann -> m (Term TyName Name uni fun ann) #

    Takes a "handler" function to execute when encountering free variables.

    freeIndexAsConsistentLevel :: (MonadReader LevelInfo m, MonadState (Map Level Unique) m, MonadQuote m) => Index -> m Unique #

    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).

    deBruijnInitIndex :: Index #

    The LamAbs index (for debruijn indices) and the starting level of DeBruijn monad