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.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.Types
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 Text
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TText Text
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TAntiText Text
_ -> () -> 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 ()
TRequirements Text
_ 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)
TRequireDevice Text
d -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Text -> Requirements
singletonDev Text
d)
TRequire Int
n Text
e -> Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add (Int -> Text -> Requirements
singletonInv Int
n Text
e)
TVar Text
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_ (Text -> ReqCtx -> Maybe Requirements
forall t. Text -> Ctx t -> Maybe t
Ctx.lookup Text
x ReqCtx
reqs) Requirements -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Accum w) sig m =>
w -> m ()
add
TLam Text
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 (Text -> ReqCtx -> ReqCtx
forall t. Text -> Ctx t -> Ctx t
Ctx.delete Text
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 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 Text
x Maybe Polytype
mty 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)
(Polytype -> m ()) -> Maybe Polytype -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Polytype -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Polytype -> m ()
polytypeRequirements Maybe Polytype
mty
forall r (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has (Reader r) sig m =>
(r -> r) -> m a -> m a
local @ReqCtx (Text -> ReqCtx -> ReqCtx
forall t. Text -> Ctx t -> Ctx t
Ctx.delete Text
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 Text
x Maybe Polytype
mty 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)
(Polytype -> m ()) -> Maybe Polytype -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Polytype -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Polytype -> m ()
polytypeRequirements Maybe Polytype
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 =
(if Bool
r then (Capability -> Requirements
singletonCap Capability
CRecursion Requirements -> Requirements -> Requirements
forall a. Semigroup a => a -> a -> a
<>) else Requirements -> Requirements
forall a. a -> a
id)
(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 (Text -> Requirements -> ReqCtx -> ReqCtx
forall t. Text -> t -> Ctx t -> Ctx t
Ctx.addBinding Text
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 Text
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 :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Polytype -> m ()
polytypeRequirements Polytype
ty
forall r (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has (Reader r) sig m =>
(r -> r) -> m a -> m a
local @TDCtx (Text -> TydefInfo -> TDCtx -> TDCtx
forall t. Text -> t -> Ctx t -> Ctx t
Ctx.addBinding Text
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
. [Text] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Text] -> Int) -> (Polytype -> [Text]) -> Polytype -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Polytype -> [Text]
forall t. Poly t -> [Text]
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 Text
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)
-> (Text -> ReqCtx -> ReqCtx) -> Maybe Text -> ReqCtx -> ReqCtx
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ReqCtx -> ReqCtx
forall a. a -> a
id Text -> ReqCtx -> ReqCtx
forall t. Text -> Ctx t -> Ctx t
Ctx.delete Maybe Text
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 Text (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
*> [(Text, Maybe Term)] -> ((Text, Maybe Term) -> m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Map Text (Maybe Term) -> [(Text, Maybe Term)]
forall k a. Map k a -> [(k, a)]
M.assocs Map Text (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 ())
-> ((Text, Maybe Term) -> Term) -> (Text, Maybe Term) -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, Maybe Term) -> Term
forall {ty}. (Text, Maybe (Term' ty)) -> Term' ty
expandEq)
where
expandEq :: (Text, Maybe (Term' ty)) -> Term' ty
expandEq (Text
x, Maybe (Term' ty)
Nothing) = Text -> Term' ty
forall ty. Text -> Term' ty
TVar Text
x
expandEq (Text
_, Just Term' ty
t) = Term' ty
t
TProj Term
t Text
_ -> 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 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
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
*> Polytype -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Polytype -> m ()
polytypeRequirements Polytype
ty
polytypeRequirements ::
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Polytype ->
m ()
polytypeRequirements :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Polytype -> m ()
polytypeRequirements (Forall [Text]
_ Type
ty) = Type -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Accum Requirements) sig m, Has (Reader TDCtx) sig m) =>
Type -> m ()
typeRequirements Type
ty
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 Text
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
TyConF (TCUser Text
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
Type
ty' <- Text -> [Type] -> m Type
forall (sig :: (* -> *) -> * -> *) (m :: * -> *) t.
(Has (Reader TDCtx) sig m, Typical t) =>
Text -> [t] -> m t
expandTydef Text
u [Type]
tys
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 Text Type
m -> (Type -> m ()) -> Map Text Type -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Type -> m ()
go Map Text Type
m
TyRecF Text
_ 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 ()