-- | The user-facing API of the untyped renamer.
-- See PlutusCore.Rename for details.

{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module UntypedPlutusCore.Rename
    ( Rename (..)
    ) where

import PlutusPrelude

import UntypedPlutusCore.Core
import UntypedPlutusCore.Mark
import UntypedPlutusCore.Rename.Internal

import PlutusCore.Core (HasUniques)
import PlutusCore.Name
import PlutusCore.Rename (Rename (..))

instance HasUniques (Term name uni fun ann) => Rename (Term name uni fun ann) where
    -- See Note [Marking].
    rename :: Term name uni fun ann -> m (Term name uni fun ann)
rename = (Term name uni fun ann -> m ())
-> Term name uni fun ann -> m (Term name uni fun ann)
forall (f :: * -> *) a b. Functor f => (a -> f b) -> a -> f a
through 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 -> m (Term name uni fun ann))
-> (Term name uni fun ann -> m (Term name uni fun ann))
-> Term name uni fun ann
-> m (Term name uni fun ann)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> RenameT ScopedRenaming m (Term name uni fun ann)
-> m (Term name uni fun ann)
forall ren (m :: * -> *) a. Monoid ren => RenameT ren m a -> m a
runRenameT (RenameT ScopedRenaming m (Term name uni fun ann)
 -> m (Term name uni fun ann))
-> (Term name uni fun ann
    -> RenameT ScopedRenaming m (Term name uni fun ann))
-> Term name uni fun ann
-> m (Term name uni fun ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term name uni fun ann
-> RenameT ScopedRenaming m (Term name uni fun ann)
forall name (uni :: * -> *) fun ann (m :: * -> *).
(HasUniques (Term name uni fun ann), MonadQuote m) =>
Term name uni fun ann -> ScopedRenameT m (Term name uni fun ann)
renameTermM

instance HasUniques (Program name uni fun ann) => Rename (Program name uni fun ann) where
    -- See Note [Marking].
    rename :: Program name uni fun ann -> m (Program name uni fun ann)
rename = (Program name uni fun ann -> m ())
-> Program name uni fun ann -> m (Program name uni fun ann)
forall (f :: * -> *) a b. Functor f => (a -> f b) -> a -> f a
through Program name uni fun ann -> m ()
forall name (m :: * -> *) (uni :: * -> *) fun ann.
(HasUnique name TermUnique, MonadQuote m) =>
Program name uni fun ann -> m ()
markNonFreshProgram (Program name uni fun ann -> m (Program name uni fun ann))
-> (Program name uni fun ann -> m (Program name uni fun ann))
-> Program name uni fun ann
-> m (Program name uni fun ann)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> RenameT ScopedRenaming m (Program name uni fun ann)
-> m (Program name uni fun ann)
forall ren (m :: * -> *) a. Monoid ren => RenameT ren m a -> m a
runRenameT (RenameT ScopedRenaming m (Program name uni fun ann)
 -> m (Program name uni fun ann))
-> (Program name uni fun ann
    -> RenameT ScopedRenaming m (Program name uni fun ann))
-> Program name uni fun ann
-> m (Program name uni fun ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Program name uni fun ann
-> RenameT ScopedRenaming m (Program name uni fun ann)
forall name (uni :: * -> *) fun ann (m :: * -> *).
(HasUniques (Program name uni fun ann), MonadQuote m) =>
Program name uni fun ann
-> ScopedRenameT m (Program name uni fun ann)
renameProgramM