module UntypedPlutusCore.Mark
    ( markNonFreshTerm
    , markNonFreshProgram
    ) where

import PlutusCore.Core (HasUniques)
import PlutusCore.Name
import PlutusCore.Quote
import UntypedPlutusCore.Core
import UntypedPlutusCore.Subst

-- | Marks all the 'Unique's in a term as used, so they will not be generated in future. Useful if you
-- have a term which was not generated in 'Quote'.
markNonFreshTerm
    :: (HasUniques (Term name uni fun ann), MonadQuote m)
    => Term name uni fun ann -> m ()
markNonFreshTerm :: Term name uni fun ann -> m ()
markNonFreshTerm = Set Unique -> m ()
forall (m :: * -> *). MonadQuote m => Set Unique -> m ()
markNonFreshMax (Set Unique -> m ())
-> (Term name uni fun ann -> Set Unique)
-> Term name uni fun ann
-> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term name uni fun ann -> Set Unique
forall name (uni :: * -> *) fun ann.
HasUniques (Term name uni fun ann) =>
Term name uni fun ann -> Set Unique
uniquesTerm

-- | Marks all the 'Unique's in a program as used, so they will not be generated in future. Useful if you
-- have a program which was not generated in 'Quote'.
markNonFreshProgram
    :: (HasUnique name TermUnique, MonadQuote m)
    => Program name uni fun ann
    -> m ()
markNonFreshProgram :: Program name uni fun ann -> m ()
markNonFreshProgram (Program ann
_ Version ann
_ Term name uni fun ann
body) = Term name uni fun ann -> m ()
forall name (uni :: * -> *) fun ann (m :: * -> *).
(HasUniques (Term name uni fun ann), MonadQuote m) =>
Term name uni fun ann -> m ()
markNonFreshTerm Term name uni fun ann
body