module Swarm.Language.Requirements.Analysis (
requirements,
) where
import Control.Algebra (Has, run)
import Control.Carrier.Accum.Strict (execAccum)
import Control.Carrier.Reader (runReader)
import Control.Carrier.Throw.Either (runThrow)
import Control.Effect.Accum (Accum, add)
import Control.Effect.Reader (Reader, ask, local)
import Control.Monad (when)
import Data.Fix (Fix (..))
import Data.Foldable (forM_)
import Data.Map qualified as M
import Swarm.Language.Capability (Capability (..), constCaps)
import Swarm.Language.Context qualified as Ctx
import Swarm.Language.Requirements.Type
import Swarm.Language.Syntax
import Swarm.Language.Syntax.Direction (isCardinal)
import Swarm.Language.TDVar (tdVarName)
import Swarm.Language.Types
import Swarm.Util (applyWhen)
requirements :: TDCtx -> ReqCtx -> Term -> Requirements
requirements :: TDCtx -> ReqCtx -> Term -> Requirements
requirements TDCtx
tdCtx ReqCtx
ctx =
Identity Requirements -> Requirements
forall a. Identity a -> a
run (Identity Requirements -> Requirements)
-> (Term -> Identity Requirements) -> Term -> Requirements
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Requirements
-> AccumC Requirements Identity () -> Identity Requirements
forall (m :: * -> *) w a. Functor m => w -> AccumC w m a -> m w
execAccum Requirements
forall a. Monoid a => a
mempty (AccumC Requirements Identity () -> Identity Requirements)
-> (Term -> AccumC Requirements Identity ())
-> Term
-> Identity Requirements
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TDCtx
-> ReaderC TDCtx (AccumC Requirements Identity) ()
-> AccumC Requirements Identity ()
forall r (m :: * -> *) a. r -> ReaderC r m a -> m a
runReader TDCtx
tdCtx (ReaderC TDCtx (AccumC Requirements Identity) ()
-> AccumC Requirements Identity ())
-> (Term -> ReaderC TDCtx (AccumC Requirements Identity) ())
-> Term
-> AccumC Requirements Identity ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReqCtx
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
-> ReaderC TDCtx (AccumC Requirements Identity) ()
forall r (m :: * -> *) a. r -> ReaderC r m a -> m a
runReader ReqCtx
ctx (ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
-> ReaderC TDCtx (AccumC Requirements Identity) ())
-> (Term
-> ReaderC
ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ())
-> Term
-> ReaderC TDCtx (AccumC Requirements Identity) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Requirements
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CPower) ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
forall a b.
ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) a
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) b
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>) (ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
-> ReaderC
ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ())
-> (Term
-> ReaderC
ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ())
-> Term
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term
-> ReaderC ReqCtx (ReaderC TDCtx (AccumC Requirements Identity)) ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go
where
go ::
( Has (Accum Requirements) sig m
, Has (Reader ReqCtx) sig m
, Has (Reader TDCtx) sig m
) =>
Term ->
m ()
go :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go = \case
Term
TUnit -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TDir Direction
d -> Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Direction -> Bool
isCardinal Direction
d) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
COrient)
TInt Integer
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TAntiInt Var
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TText Var
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TAntiText Var
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TBool Bool
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TSuspend {} -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TType {} -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TRequirements Var
_ Term
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TConst Const
c -> Maybe Capability -> (Capability -> m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Const -> Maybe Capability
constCaps Const
c) (Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Requirements -> m ())
-> (Capability -> Requirements) -> Capability -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Capability -> Requirements
singletonCap)
TRequire Var
d -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Var -> Requirements
singletonDev Var
d)
TStock Int
n Var
e -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Int -> Var -> Requirements
singletonInv Int
n Var
e)
TVar Var
x -> do
ReqCtx
reqs <- forall r (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Reader r) sig m =>
m r
ask @ReqCtx
Maybe Requirements -> (Requirements -> m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Var -> ReqCtx -> Maybe Requirements
forall v t. Ord v => v -> Ctx v t -> Maybe t
Ctx.lookup Var
x ReqCtx
reqs) Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add
TLam Var
x Maybe Type
mty Term
t -> do
Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CLambda)
(Type -> m ()) -> Maybe Type -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Type -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Type -> m ()
typeRequirements Maybe Type
mty
forall r (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has (Reader r) sig m =>
(r -> r) -> m a -> m a
local @ReqCtx (Var -> ReqCtx -> ReqCtx
forall v t.
(Ord v, Hashable v, Hashable t) =>
v -> Ctx v t -> Ctx v t
Ctx.delete Var
x) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t
TApp t1 :: Term
t1@(TConst Const
Use) t2 :: Term
t2@(TText Var
device) ->
Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Var -> Requirements
singletonDev Var
device) m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t1 m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t2
TApp Term
t1 Term
t2 -> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t1 m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t2
TLet LetSyntax
LSLet Bool
r Var
x Maybe RawPolytype
mty Maybe Polytype
_ Maybe Requirements
_ Term
t1 Term
t2 -> do
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
r (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CRecursion)
Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CEnv)
(RawPolytype -> m ()) -> Maybe RawPolytype -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ RawPolytype -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *)
(q :: ImplicitQuantification).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Poly q Type -> m ()
polytypeRequirements Maybe RawPolytype
mty
forall r (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has (Reader r) sig m =>
(r -> r) -> m a -> m a
local @ReqCtx (Var -> ReqCtx -> ReqCtx
forall v t.
(Ord v, Hashable v, Hashable t) =>
v -> Ctx v t -> Ctx v t
Ctx.delete Var
x) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t1 m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t2
TLet LetSyntax
LSDef Bool
r Var
x Maybe RawPolytype
mty Maybe Polytype
_ Maybe Requirements
_ Term
t1 Term
t2 -> do
Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CEnv)
(RawPolytype -> m ()) -> Maybe RawPolytype -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ RawPolytype -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *)
(q :: ImplicitQuantification).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Poly q Type -> m ()
polytypeRequirements Maybe RawPolytype
mty
ReqCtx
localReqCtx <- forall r (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Reader r) sig m =>
m r
ask @ReqCtx
TDCtx
localTDCtx <- forall r (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Reader r) sig m =>
m r
ask @TDCtx
let bodyReqs :: Requirements
bodyReqs =
Bool
-> (Requirements -> Requirements) -> Requirements -> Requirements
forall a. Bool -> (a -> a) -> a -> a
applyWhen Bool
r (Capability -> Requirements
singletonCap Capability
CRecursion Requirements -> Requirements -> Requirements
forall a. Semigroup a => a -> a -> a
<>) (Requirements -> Requirements) -> Requirements -> Requirements
forall a b. (a -> b) -> a -> b
$
TDCtx -> ReqCtx -> Term -> Requirements
requirements TDCtx
localTDCtx ReqCtx
localReqCtx Term
t1
forall r (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has (Reader r) sig m =>
(r -> r) -> m a -> m a
local @ReqCtx (Var -> Requirements -> ReqCtx -> ReqCtx
forall v t.
(Ord v, Hashable v, Hashable t) =>
v -> t -> Ctx v t -> Ctx v t
Ctx.addBinding Var
x Requirements
bodyReqs) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t2
TTydef TDVar
x Polytype
ty Maybe TydefInfo
_ Term
t2 -> do
Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CEnv)
Polytype -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *)
(q :: ImplicitQuantification).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Poly q Type -> m ()
polytypeRequirements Polytype
ty
forall r (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has (Reader r) sig m =>
(r -> r) -> m a -> m a
local @TDCtx (Var -> TydefInfo -> TDCtx -> TDCtx
addBindingTD (TDVar -> Var
tdVarName TDVar
x) (Polytype -> Arity -> TydefInfo
TydefInfo Polytype
ty (Int -> Arity
Arity (Int -> Arity) -> (Polytype -> Int) -> Polytype -> Arity
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Var] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Var] -> Int) -> (Polytype -> [Var]) -> Polytype -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Polytype -> [Var]
forall t. Poly 'Quantified t -> [Var]
ptVars (Polytype -> Arity) -> Polytype -> Arity
forall a b. (a -> b) -> a -> b
$ Polytype
ty))) (Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t2)
TBind Maybe Var
mx Maybe Polytype
_ Maybe Requirements
_ Term
t1 Term
t2 -> do
Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t1
forall r (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has (Reader r) sig m =>
(r -> r) -> m a -> m a
local @ReqCtx ((ReqCtx -> ReqCtx)
-> (Var -> ReqCtx -> ReqCtx) -> Maybe Var -> ReqCtx -> ReqCtx
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ReqCtx -> ReqCtx
forall a. a -> a
id Var -> ReqCtx -> ReqCtx
forall v t.
(Ord v, Hashable v, Hashable t) =>
v -> Ctx v t -> Ctx v t
Ctx.delete Maybe Var
mx) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t2
TPair Term
t1 Term
t2 -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CProd) m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t1 m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t2
TDelay Term
t -> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t
TRcd Map Var (Maybe Term)
m -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CRecord) m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> [(Var, Maybe Term)] -> ((Var, Maybe Term) -> m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Map Var (Maybe Term) -> [(Var, Maybe Term)]
forall k a. Map k a -> [(k, a)]
M.assocs Map Var (Maybe Term)
m) (Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go (Term -> m ())
-> ((Var, Maybe Term) -> Term) -> (Var, Maybe Term) -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Var, Maybe Term) -> Term
forall {ty}. (Var, Maybe (Term' ty)) -> Term' ty
expandEq)
where
expandEq :: (Var, Maybe (Term' ty)) -> Term' ty
expandEq (Var
x, Maybe (Term' ty)
Nothing) = Var -> Term' ty
forall ty. Var -> Term' ty
TVar Var
x
expandEq (Var
_, Just Term' ty
t) = Term' ty
t
TProj Term
t Var
_ -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CRecord) m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t
TAnnotate Term
t RawPolytype
ty -> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> RawPolytype -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *)
(q :: ImplicitQuantification).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Poly q Type -> m ()
polytypeRequirements RawPolytype
ty
TParens Term
t -> Term -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader ReqCtx) sig m,
Has (Reader TDCtx) sig m) =>
Term -> m ()
go Term
t
polytypeRequirements ::
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Poly q Type ->
m ()
polytypeRequirements :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *)
(q :: ImplicitQuantification).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Poly q Type -> m ()
polytypeRequirements = Type -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Type -> m ()
typeRequirements (Type -> m ()) -> (Poly q Type -> Type) -> Poly q Type -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Poly q Type -> Type
forall (q :: ImplicitQuantification) t. Poly q t -> t
ptBody
typeRequirements ::
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Type ->
m ()
typeRequirements :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Type -> m ()
typeRequirements = Type -> m ()
go
where
go :: Type -> m ()
go (Fix TypeF Type
tyF) = TypeF Type -> m ()
goF TypeF Type
tyF
goF :: TypeF Type -> m ()
goF = \case
TyVarF Var
_ Var
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TyConF (TCUser TDVar
u) [Type]
tys -> do
(Type -> m ()) -> [Type] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Type -> m ()
go [Type]
tys
Either ExpandTydefErr Type
res <- forall e (m :: * -> *) a. ThrowC e m a -> m (Either e a)
runThrow @ExpandTydefErr (TDVar -> [Type] -> ThrowC ExpandTydefErr m Type
forall (sig :: (* -> *) -> * -> *) (m :: * -> *) t.
(Has (Reader TDCtx) sig m, Has (Throw ExpandTydefErr) sig m,
Typical t) =>
TDVar -> [t] -> m t
expandTydef TDVar
u [Type]
tys)
case Either ExpandTydefErr Type
res of
Left ExpandTydefErr
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
Right Type
ty' -> Type -> m ()
go Type
ty'
TyConF TyCon
c [Type]
tys -> do
case TyCon
c of
TyCon
TCSum -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CSum)
TyCon
TCProd -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CProd)
TyCon
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
(Type -> m ()) -> [Type] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Type -> m ()
go [Type]
tys
TyRcdF Map Var Type
m -> (Type -> m ()) -> Map Var Type -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Type -> m ()
go Map Var Type
m
TyRecF Var
_ Type
ty' -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Capability -> Requirements
singletonCap Capability
CRectype) m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Type -> m ()
go Type
ty'
TyRecVarF Nat
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()