{-# LANGUAGE LambdaCase #-}
module PlutusCore.Analysis.Definitions
    ( UniqueInfos
    , ScopeType(..)
    , termDefs
    , typeDefs
    , runTermDefs
    , runTypeDefs
    , addDef
    , addUsage
    ) where
import PlutusCore.Core
import PlutusCore.Error
import PlutusCore.Name
import Data.Functor.Foldable
import Control.Lens hiding (use, uses)
import Control.Monad.Except
import Control.Monad.State
import Control.Monad.Writer
import Data.Foldable
import Data.Set qualified as Set
type UniqueInfo ann = (Maybe (ScopedLoc ann), Set.Set (ScopedLoc ann))
type UniqueInfos ann = UniqueMap Unique (UniqueInfo ann)
data ScopedLoc ann = ScopedLoc ScopeType ann deriving stock (ScopedLoc ann -> ScopedLoc ann -> Bool
(ScopedLoc ann -> ScopedLoc ann -> Bool)
-> (ScopedLoc ann -> ScopedLoc ann -> Bool) -> Eq (ScopedLoc ann)
forall ann. Eq ann => ScopedLoc ann -> ScopedLoc ann -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScopedLoc ann -> ScopedLoc ann -> Bool
$c/= :: forall ann. Eq ann => ScopedLoc ann -> ScopedLoc ann -> Bool
== :: ScopedLoc ann -> ScopedLoc ann -> Bool
$c== :: forall ann. Eq ann => ScopedLoc ann -> ScopedLoc ann -> Bool
Eq, Eq (ScopedLoc ann)
Eq (ScopedLoc ann)
-> (ScopedLoc ann -> ScopedLoc ann -> Ordering)
-> (ScopedLoc ann -> ScopedLoc ann -> Bool)
-> (ScopedLoc ann -> ScopedLoc ann -> Bool)
-> (ScopedLoc ann -> ScopedLoc ann -> Bool)
-> (ScopedLoc ann -> ScopedLoc ann -> Bool)
-> (ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann)
-> (ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann)
-> Ord (ScopedLoc ann)
ScopedLoc ann -> ScopedLoc ann -> Bool
ScopedLoc ann -> ScopedLoc ann -> Ordering
ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ann. Ord ann => Eq (ScopedLoc ann)
forall ann. Ord ann => ScopedLoc ann -> ScopedLoc ann -> Bool
forall ann. Ord ann => ScopedLoc ann -> ScopedLoc ann -> Ordering
forall ann.
Ord ann =>
ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann
min :: ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann
$cmin :: forall ann.
Ord ann =>
ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann
max :: ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann
$cmax :: forall ann.
Ord ann =>
ScopedLoc ann -> ScopedLoc ann -> ScopedLoc ann
>= :: ScopedLoc ann -> ScopedLoc ann -> Bool
$c>= :: forall ann. Ord ann => ScopedLoc ann -> ScopedLoc ann -> Bool
> :: ScopedLoc ann -> ScopedLoc ann -> Bool
$c> :: forall ann. Ord ann => ScopedLoc ann -> ScopedLoc ann -> Bool
<= :: ScopedLoc ann -> ScopedLoc ann -> Bool
$c<= :: forall ann. Ord ann => ScopedLoc ann -> ScopedLoc ann -> Bool
< :: ScopedLoc ann -> ScopedLoc ann -> Bool
$c< :: forall ann. Ord ann => ScopedLoc ann -> ScopedLoc ann -> Bool
compare :: ScopedLoc ann -> ScopedLoc ann -> Ordering
$ccompare :: forall ann. Ord ann => ScopedLoc ann -> ScopedLoc ann -> Ordering
$cp1Ord :: forall ann. Ord ann => Eq (ScopedLoc ann)
Ord)
data ScopeType = TermScope | TypeScope deriving stock (ScopeType -> ScopeType -> Bool
(ScopeType -> ScopeType -> Bool)
-> (ScopeType -> ScopeType -> Bool) -> Eq ScopeType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScopeType -> ScopeType -> Bool
$c/= :: ScopeType -> ScopeType -> Bool
== :: ScopeType -> ScopeType -> Bool
$c== :: ScopeType -> ScopeType -> Bool
Eq, Eq ScopeType
Eq ScopeType
-> (ScopeType -> ScopeType -> Ordering)
-> (ScopeType -> ScopeType -> Bool)
-> (ScopeType -> ScopeType -> Bool)
-> (ScopeType -> ScopeType -> Bool)
-> (ScopeType -> ScopeType -> Bool)
-> (ScopeType -> ScopeType -> ScopeType)
-> (ScopeType -> ScopeType -> ScopeType)
-> Ord ScopeType
ScopeType -> ScopeType -> Bool
ScopeType -> ScopeType -> Ordering
ScopeType -> ScopeType -> ScopeType
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ScopeType -> ScopeType -> ScopeType
$cmin :: ScopeType -> ScopeType -> ScopeType
max :: ScopeType -> ScopeType -> ScopeType
$cmax :: ScopeType -> ScopeType -> ScopeType
>= :: ScopeType -> ScopeType -> Bool
$c>= :: ScopeType -> ScopeType -> Bool
> :: ScopeType -> ScopeType -> Bool
$c> :: ScopeType -> ScopeType -> Bool
<= :: ScopeType -> ScopeType -> Bool
$c<= :: ScopeType -> ScopeType -> Bool
< :: ScopeType -> ScopeType -> Bool
$c< :: ScopeType -> ScopeType -> Bool
compare :: ScopeType -> ScopeType -> Ordering
$ccompare :: ScopeType -> ScopeType -> Ordering
$cp1Ord :: Eq ScopeType
Ord)
lookupDef
    :: (Ord ann,
        HasUnique name unique,
        MonadState (UniqueInfos ann) m)
    => name
    -> m (UniqueInfo ann)
lookupDef :: name -> m (UniqueInfo ann)
lookupDef name
n = do
    Maybe (UniqueInfo ann)
previousDef <- (UniqueMap Unique (UniqueInfo ann) -> Maybe (UniqueInfo ann))
-> m (Maybe (UniqueInfo ann))
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets ((UniqueMap Unique (UniqueInfo ann) -> Maybe (UniqueInfo ann))
 -> m (Maybe (UniqueInfo ann)))
-> (UniqueMap Unique (UniqueInfo ann) -> Maybe (UniqueInfo ann))
-> m (Maybe (UniqueInfo ann))
forall a b. (a -> b) -> a -> b
$ name -> UniqueMap Unique (UniqueInfo ann) -> Maybe (UniqueInfo ann)
forall name unique1 unique2 a.
(HasUnique name unique1, Coercible unique2 Unique) =>
name -> UniqueMap unique2 a -> Maybe a
lookupNameIndex name
n
    case Maybe (UniqueInfo ann)
previousDef of
        Just UniqueInfo ann
d -> UniqueInfo ann -> m (UniqueInfo ann)
forall (f :: * -> *) a. Applicative f => a -> f a
pure UniqueInfo ann
d
        Maybe (UniqueInfo ann)
Nothing -> do
            let empty :: (Maybe a, Set (ScopedLoc ann))
empty = (Maybe a
forall a. Maybe a
Nothing, Set (ScopedLoc ann)
forall a. Monoid a => a
mempty)
            (UniqueMap Unique (UniqueInfo ann)
 -> UniqueMap Unique (UniqueInfo ann))
-> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((UniqueMap Unique (UniqueInfo ann)
  -> UniqueMap Unique (UniqueInfo ann))
 -> m ())
-> (UniqueMap Unique (UniqueInfo ann)
    -> UniqueMap Unique (UniqueInfo ann))
-> m ()
forall a b. (a -> b) -> a -> b
$ name
-> UniqueInfo ann
-> UniqueMap Unique (UniqueInfo ann)
-> UniqueMap Unique (UniqueInfo ann)
forall name unique1 unique2 a.
(HasUnique name unique1, Coercible unique2 Unique) =>
name -> a -> UniqueMap unique2 a -> UniqueMap unique2 a
insertByNameIndex name
n UniqueInfo ann
forall a. (Maybe a, Set (ScopedLoc ann))
empty
            UniqueInfo ann -> m (UniqueInfo ann)
forall (f :: * -> *) a. Applicative f => a -> f a
pure UniqueInfo ann
forall a. (Maybe a, Set (ScopedLoc ann))
empty
addDef
    :: (Ord ann,
        HasUnique n unique,
        MonadState (UniqueInfos ann) m,
        MonadWriter [UniqueError ann] m)
    => n 
    -> ann 
    -> ScopeType 
    -> m ()
addDef :: n -> ann -> ScopeType -> m ()
addDef n
n ann
newDef ScopeType
tpe = do
    let def :: ScopedLoc ann
def = ScopeType -> ann -> ScopedLoc ann
forall ann. ScopeType -> ann -> ScopedLoc ann
ScopedLoc ScopeType
tpe ann
newDef
    d :: UniqueInfo ann
d@(Maybe (ScopedLoc ann)
_, Set (ScopedLoc ann)
uses) <- n -> m (UniqueInfo ann)
forall ann name unique (m :: * -> *).
(Ord ann, HasUnique name unique, MonadState (UniqueInfos ann) m) =>
name -> m (UniqueInfo ann)
lookupDef n
n
    n -> ScopedLoc ann -> UniqueInfo ann -> m ()
forall n u ann (m :: * -> *).
(HasUnique n u, MonadState (UniqueInfos ann) m,
 MonadWriter [UniqueError ann] m) =>
n -> ScopedLoc ann -> UniqueInfo ann -> m ()
checkUndefined n
n ScopedLoc ann
def UniqueInfo ann
d
    (UniqueMap Unique (UniqueInfo ann)
 -> UniqueMap Unique (UniqueInfo ann))
-> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((UniqueMap Unique (UniqueInfo ann)
  -> UniqueMap Unique (UniqueInfo ann))
 -> m ())
-> (UniqueMap Unique (UniqueInfo ann)
    -> UniqueMap Unique (UniqueInfo ann))
-> m ()
forall a b. (a -> b) -> a -> b
$ n
-> UniqueInfo ann
-> UniqueMap Unique (UniqueInfo ann)
-> UniqueMap Unique (UniqueInfo ann)
forall name unique1 unique2 a.
(HasUnique name unique1, Coercible unique2 Unique) =>
name -> a -> UniqueMap unique2 a -> UniqueMap unique2 a
insertByNameIndex n
n (ScopedLoc ann -> Maybe (ScopedLoc ann)
forall a. a -> Maybe a
Just ScopedLoc ann
def, Set (ScopedLoc ann)
uses)
checkUndefined
    :: (HasUnique n u,
        MonadState (UniqueInfos ann) m,
        MonadWriter [UniqueError ann] m)
    => n 
    -> ScopedLoc ann 
    -> UniqueInfo ann 
    -> m ()
checkUndefined :: n -> ScopedLoc ann -> UniqueInfo ann -> m ()
checkUndefined n
n (ScopedLoc ScopeType
_ ann
newDef) UniqueInfo ann
info = case UniqueInfo ann
info of
    (Just (ScopedLoc ScopeType
_ ann
prevDef), Set (ScopedLoc ann)
_) -> [UniqueError ann] -> m ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Unique -> ann -> ann -> UniqueError ann
forall ann. Unique -> ann -> ann -> UniqueError ann
MultiplyDefined (n
n n -> Getting Unique n Unique -> Unique
forall s a. s -> Getting a s a -> a
^. Getting Unique n Unique
forall name unique. HasUnique name unique => Lens' name Unique
theUnique) ann
prevDef ann
newDef]
    UniqueInfo ann
_                               -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
addUsage
    :: (Ord ann,
        HasUnique n unique,
        MonadState (UniqueInfos ann) m,
        MonadWriter [UniqueError ann] m)
    => n 
    -> ann 
    -> ScopeType 
    -> m ()
addUsage :: n -> ann -> ScopeType -> m ()
addUsage n
n ann
newUse ScopeType
tpe = do
    let use :: ScopedLoc ann
use = ScopeType -> ann -> ScopedLoc ann
forall ann. ScopeType -> ann -> ScopedLoc ann
ScopedLoc ScopeType
tpe ann
newUse
    d :: UniqueInfo ann
d@(Maybe (ScopedLoc ann)
def, Set (ScopedLoc ann)
uses) <- n -> m (UniqueInfo ann)
forall ann name unique (m :: * -> *).
(Ord ann, HasUnique name unique, MonadState (UniqueInfos ann) m) =>
name -> m (UniqueInfo ann)
lookupDef n
n
    n -> ScopedLoc ann -> UniqueInfo ann -> m ()
forall n u ann (m :: * -> *).
(HasUnique n u, MonadWriter [UniqueError ann] m) =>
n -> ScopedLoc ann -> UniqueInfo ann -> m ()
checkCoherency n
n ScopedLoc ann
use UniqueInfo ann
d
    n -> ScopedLoc ann -> UniqueInfo ann -> m ()
forall n u ann (m :: * -> *).
(HasUnique n u, MonadWriter [UniqueError ann] m) =>
n -> ScopedLoc ann -> UniqueInfo ann -> m ()
checkDefined n
n ScopedLoc ann
use UniqueInfo ann
d
    (UniqueMap Unique (UniqueInfo ann)
 -> UniqueMap Unique (UniqueInfo ann))
-> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((UniqueMap Unique (UniqueInfo ann)
  -> UniqueMap Unique (UniqueInfo ann))
 -> m ())
-> (UniqueMap Unique (UniqueInfo ann)
    -> UniqueMap Unique (UniqueInfo ann))
-> m ()
forall a b. (a -> b) -> a -> b
$ n
-> UniqueInfo ann
-> UniqueMap Unique (UniqueInfo ann)
-> UniqueMap Unique (UniqueInfo ann)
forall name unique1 unique2 a.
(HasUnique name unique1, Coercible unique2 Unique) =>
name -> a -> UniqueMap unique2 a -> UniqueMap unique2 a
insertByNameIndex n
n (Maybe (ScopedLoc ann)
def, ScopedLoc ann -> Set (ScopedLoc ann) -> Set (ScopedLoc ann)
forall a. Ord a => a -> Set a -> Set a
Set.insert ScopedLoc ann
use Set (ScopedLoc ann)
uses)
checkDefined
    :: (HasUnique n u,
        MonadWriter [UniqueError ann] m)
    => n 
    -> ScopedLoc ann 
    -> UniqueInfo ann 
    -> m ()
checkDefined :: n -> ScopedLoc ann -> UniqueInfo ann -> m ()
checkDefined n
n (ScopedLoc ScopeType
_ ann
loc) (Maybe (ScopedLoc ann)
def, Set (ScopedLoc ann)
_) = case Maybe (ScopedLoc ann)
def of
    Maybe (ScopedLoc ann)
Nothing -> [UniqueError ann] -> m ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Unique -> ann -> UniqueError ann
forall ann. Unique -> ann -> UniqueError ann
FreeVariable (n
n n -> Getting Unique n Unique -> Unique
forall s a. s -> Getting a s a -> a
^. Getting Unique n Unique
forall name unique. HasUnique name unique => Lens' name Unique
theUnique) ann
loc]
    Just ScopedLoc ann
_  -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
checkCoherency
    :: (HasUnique n u,
        MonadWriter [UniqueError ann] m)
    => n 
    -> ScopedLoc ann 
    -> UniqueInfo ann 
    -> m ()
checkCoherency :: n -> ScopedLoc ann -> UniqueInfo ann -> m ()
checkCoherency n
n (ScopedLoc ScopeType
tpe ann
loc) (Maybe (ScopedLoc ann)
def, Set (ScopedLoc ann)
uses) = do
    Maybe (ScopedLoc ann) -> (ScopedLoc ann -> m ()) -> m ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ Maybe (ScopedLoc ann)
def ScopedLoc ann -> m ()
forall (f :: * -> *).
MonadWriter [UniqueError ann] f =>
ScopedLoc ann -> f ()
checkLoc
    [ScopedLoc ann] -> (ScopedLoc ann -> m ()) -> m ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Set (ScopedLoc ann) -> [ScopedLoc ann]
forall a. Set a -> [a]
Set.toList Set (ScopedLoc ann)
uses) ScopedLoc ann -> m ()
forall (f :: * -> *).
MonadWriter [UniqueError ann] f =>
ScopedLoc ann -> f ()
checkLoc
    where
        checkLoc :: ScopedLoc ann -> f ()
checkLoc (ScopedLoc ScopeType
tpe' ann
loc') = Bool -> f () -> f ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ScopeType
tpe' ScopeType -> ScopeType -> Bool
forall a. Eq a => a -> a -> Bool
/= ScopeType
tpe) (f () -> f ()) -> f () -> f ()
forall a b. (a -> b) -> a -> b
$
            [UniqueError ann] -> f ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Unique -> ann -> ann -> UniqueError ann
forall ann. Unique -> ann -> ann -> UniqueError ann
IncoherentUsage (n
n n -> Getting Unique n Unique -> Unique
forall s a. s -> Getting a s a -> a
^. Getting Unique n Unique
forall name unique. HasUnique name unique => Lens' name Unique
theUnique) ann
loc' ann
loc]
termDefs
    :: (Ord ann,
        HasUnique name TermUnique,
        HasUnique tyname TypeUnique,
        MonadState (UniqueInfos ann) m,
        MonadWriter [UniqueError ann] m)
    => Term tyname name uni fun ann
    -> m ()
termDefs :: Term tyname name uni fun ann -> m ()
termDefs = (Base (Term tyname name uni fun ann) (m ()) -> m ())
-> Term tyname name uni fun ann -> m ()
forall t a. Recursive t => (Base t a -> a) -> t -> a
cata ((Base (Term tyname name uni fun ann) (m ()) -> m ())
 -> Term tyname name uni fun ann -> m ())
-> (Base (Term tyname name uni fun ann) (m ()) -> m ())
-> Term tyname name uni fun ann
-> m ()
forall a b. (a -> b) -> a -> b
$ \case
    VarF ann n         -> name -> ann -> ScopeType -> m ()
forall ann n unique (m :: * -> *).
(Ord ann, HasUnique n unique, MonadState (UniqueInfos ann) m,
 MonadWriter [UniqueError ann] m) =>
n -> ann -> ScopeType -> m ()
addUsage name
n ann
ann ScopeType
TermScope
    LamAbsF ann n ty t -> name -> ann -> ScopeType -> m ()
forall ann n unique (m :: * -> *).
(Ord ann, HasUnique n unique, MonadState (UniqueInfos ann) m,
 MonadWriter [UniqueError ann] m) =>
n -> ann -> ScopeType -> m ()
addDef name
n ann
ann ScopeType
TermScope m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Type tyname uni ann -> m ()
forall ann tyname (m :: * -> *) (uni :: * -> *).
(Ord ann, HasUnique tyname TypeUnique,
 MonadState (UniqueInfos ann) m, MonadWriter [UniqueError ann] m) =>
Type tyname uni ann -> m ()
typeDefs Type tyname uni ann
ty m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m ()
t
    IWrapF _ pat arg t -> Type tyname uni ann -> m ()
forall ann tyname (m :: * -> *) (uni :: * -> *).
(Ord ann, HasUnique tyname TypeUnique,
 MonadState (UniqueInfos ann) m, MonadWriter [UniqueError ann] m) =>
Type tyname uni ann -> m ()
typeDefs Type tyname uni ann
pat m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Type tyname uni ann -> m ()
forall ann tyname (m :: * -> *) (uni :: * -> *).
(Ord ann, HasUnique tyname TypeUnique,
 MonadState (UniqueInfos ann) m, MonadWriter [UniqueError ann] m) =>
Type tyname uni ann -> m ()
typeDefs Type tyname uni ann
arg m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m ()
t
    TyAbsF ann tn _ t  -> tyname -> ann -> ScopeType -> m ()
forall ann n unique (m :: * -> *).
(Ord ann, HasUnique n unique, MonadState (UniqueInfos ann) m,
 MonadWriter [UniqueError ann] m) =>
n -> ann -> ScopeType -> m ()
addDef tyname
tn ann
ann ScopeType
TypeScope m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m ()
t
    TyInstF _ t ty     -> m ()
t m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Type tyname uni ann -> m ()
forall ann tyname (m :: * -> *) (uni :: * -> *).
(Ord ann, HasUnique tyname TypeUnique,
 MonadState (UniqueInfos ann) m, MonadWriter [UniqueError ann] m) =>
Type tyname uni ann -> m ()
typeDefs Type tyname uni ann
ty
    Base (Term tyname name uni fun ann) (m ())
x                  -> TermF tyname name uni fun ann (m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ Base (Term tyname name uni fun ann) (m ())
TermF tyname name uni fun ann (m ())
x
typeDefs
    :: (Ord ann,
        HasUnique tyname TypeUnique,
        MonadState (UniqueInfos ann) m,
        MonadWriter [UniqueError ann] m)
    => Type tyname uni ann
    -> m ()
typeDefs :: Type tyname uni ann -> m ()
typeDefs = (Base (Type tyname uni ann) (m ()) -> m ())
-> Type tyname uni ann -> m ()
forall t a. Recursive t => (Base t a -> a) -> t -> a
cata ((Base (Type tyname uni ann) (m ()) -> m ())
 -> Type tyname uni ann -> m ())
-> (Base (Type tyname uni ann) (m ()) -> m ())
-> Type tyname uni ann
-> m ()
forall a b. (a -> b) -> a -> b
$ \case
    TyVarF ann n         -> tyname -> ann -> ScopeType -> m ()
forall ann n unique (m :: * -> *).
(Ord ann, HasUnique n unique, MonadState (UniqueInfos ann) m,
 MonadWriter [UniqueError ann] m) =>
n -> ann -> ScopeType -> m ()
addUsage tyname
n ann
ann ScopeType
TypeScope
    TyForallF ann tn _ t -> tyname -> ann -> ScopeType -> m ()
forall ann n unique (m :: * -> *).
(Ord ann, HasUnique n unique, MonadState (UniqueInfos ann) m,
 MonadWriter [UniqueError ann] m) =>
n -> ann -> ScopeType -> m ()
addDef tyname
tn ann
ann ScopeType
TypeScope m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m ()
t
    TyLamF ann tn _ t    -> tyname -> ann -> ScopeType -> m ()
forall ann n unique (m :: * -> *).
(Ord ann, HasUnique n unique, MonadState (UniqueInfos ann) m,
 MonadWriter [UniqueError ann] m) =>
n -> ann -> ScopeType -> m ()
addDef tyname
tn ann
ann ScopeType
TypeScope m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m ()
t
    Base (Type tyname uni ann) (m ())
x                    -> TypeF tyname uni ann (m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ Base (Type tyname uni ann) (m ())
TypeF tyname uni ann (m ())
x
runTermDefs
    :: (Ord ann,
        HasUnique name TermUnique,
        HasUnique tyname TypeUnique,
        Monad m)
    => Term tyname name uni fun ann
    -> m (UniqueInfos ann, [UniqueError ann])
runTermDefs :: Term tyname name uni fun ann
-> m (UniqueInfos ann, [UniqueError ann])
runTermDefs = WriterT [UniqueError ann] m (UniqueInfos ann)
-> m (UniqueInfos ann, [UniqueError ann])
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (WriterT [UniqueError ann] m (UniqueInfos ann)
 -> m (UniqueInfos ann, [UniqueError ann]))
-> (Term tyname name uni fun ann
    -> WriterT [UniqueError ann] m (UniqueInfos ann))
-> Term tyname name uni fun ann
-> m (UniqueInfos ann, [UniqueError ann])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
 -> UniqueInfos ann
 -> WriterT [UniqueError ann] m (UniqueInfos ann))
-> UniqueInfos ann
-> StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
-> WriterT [UniqueError ann] m (UniqueInfos ann)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
-> UniqueInfos ann -> WriterT [UniqueError ann] m (UniqueInfos ann)
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m s
execStateT UniqueInfos ann
forall a. Monoid a => a
mempty (StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
 -> WriterT [UniqueError ann] m (UniqueInfos ann))
-> (Term tyname name uni fun ann
    -> StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ())
-> Term tyname name uni fun ann
-> WriterT [UniqueError ann] m (UniqueInfos ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term tyname name uni fun ann
-> StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
forall ann name tyname (m :: * -> *) (uni :: * -> *) fun.
(Ord ann, HasUnique name TermUnique, HasUnique tyname TypeUnique,
 MonadState (UniqueInfos ann) m, MonadWriter [UniqueError ann] m) =>
Term tyname name uni fun ann -> m ()
termDefs
runTypeDefs
    :: (Ord ann,
        HasUnique tyname TypeUnique,
        Monad m)
    => Type tyname uni ann
    -> m (UniqueInfos ann, [UniqueError ann])
runTypeDefs :: Type tyname uni ann -> m (UniqueInfos ann, [UniqueError ann])
runTypeDefs = WriterT [UniqueError ann] m (UniqueInfos ann)
-> m (UniqueInfos ann, [UniqueError ann])
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (WriterT [UniqueError ann] m (UniqueInfos ann)
 -> m (UniqueInfos ann, [UniqueError ann]))
-> (Type tyname uni ann
    -> WriterT [UniqueError ann] m (UniqueInfos ann))
-> Type tyname uni ann
-> m (UniqueInfos ann, [UniqueError ann])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
 -> UniqueInfos ann
 -> WriterT [UniqueError ann] m (UniqueInfos ann))
-> UniqueInfos ann
-> StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
-> WriterT [UniqueError ann] m (UniqueInfos ann)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
-> UniqueInfos ann -> WriterT [UniqueError ann] m (UniqueInfos ann)
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m s
execStateT UniqueInfos ann
forall a. Monoid a => a
mempty (StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
 -> WriterT [UniqueError ann] m (UniqueInfos ann))
-> (Type tyname uni ann
    -> StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ())
-> Type tyname uni ann
-> WriterT [UniqueError ann] m (UniqueInfos ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type tyname uni ann
-> StateT (UniqueInfos ann) (WriterT [UniqueError ann] m) ()
forall ann tyname (m :: * -> *) (uni :: * -> *).
(Ord ann, HasUnique tyname TypeUnique,
 MonadState (UniqueInfos ann) m, MonadWriter [UniqueError ann] m) =>
Type tyname uni ann -> m ()
typeDefs