module Agda.TypeChecking.Monad.Closure where

import Control.Monad

import Agda.TypeChecking.Monad.Base
import Agda.TypeChecking.Monad.Env
import Agda.TypeChecking.Monad.State

import Agda.Utils.Lens

enterClosure :: (MonadTCEnv m, ReadTCState m, LensClosure a c)
             => c -> (a -> m b) -> m b
enterClosure :: c -> (a -> m b) -> m b
enterClosure c
c a -> m b
k | Closure Signature
_sig TCEnv
env ScopeInfo
scope Map ModuleName CheckpointId
cps a
x <- c
c c -> Lens' (Closure a) c -> Closure a
forall o i. o -> Lens' i o -> i
^. forall a b. LensClosure a b => Lens' (Closure a) b
Lens' (Closure a) c
lensClosure = do
  Bool
isDbg <- Lens' Bool TCEnv -> m Bool
forall (m :: * -> *) a. MonadTCEnv m => Lens' a TCEnv -> m a
viewTC Lens' Bool TCEnv
eIsDebugPrinting
  ScopeInfo -> m b -> m b
forall (m :: * -> *) a. ReadTCState m => ScopeInfo -> m a -> m a
withScope_ ScopeInfo
scope
    (m b -> m b) -> m b -> m b
forall a b. (a -> b) -> a -> b
$ Lens' (Map ModuleName CheckpointId) TCState
-> (Map ModuleName CheckpointId -> Map ModuleName CheckpointId)
-> m b
-> m b
forall (m :: * -> *) a b.
ReadTCState m =>
Lens' a TCState -> (a -> a) -> m b -> m b
locallyTCState Lens' (Map ModuleName CheckpointId) TCState
stModuleCheckpoints (Map ModuleName CheckpointId
-> Map ModuleName CheckpointId -> Map ModuleName CheckpointId
forall a b. a -> b -> a
const Map ModuleName CheckpointId
cps)
    (m b -> m b) -> m b -> m b
forall a b. (a -> b) -> a -> b
$ TCEnv -> m b -> m b
forall (m :: * -> *) a. MonadTCEnv m => TCEnv -> m a -> m a
withEnv TCEnv
env{ envIsDebugPrinting :: Bool
envIsDebugPrinting = Bool
isDbg }
    (m b -> m b) -> m b -> m b
forall a b. (a -> b) -> a -> b
$ a -> m b
k a
x

withClosure :: (MonadTCEnv m, ReadTCState m) => Closure a -> (a -> m b) -> m (Closure b)
withClosure :: Closure a -> (a -> m b) -> m (Closure b)
withClosure Closure a
cl a -> m b
k = Closure a -> (a -> m (Closure b)) -> m (Closure b)
forall (m :: * -> *) a c b.
(MonadTCEnv m, ReadTCState m, LensClosure a c) =>
c -> (a -> m b) -> m b
enterClosure Closure a
cl ((a -> m (Closure b)) -> m (Closure b))
-> (a -> m (Closure b)) -> m (Closure b)
forall a b. (a -> b) -> a -> b
$ a -> m b
k (a -> m b) -> (b -> m (Closure b)) -> a -> m (Closure b)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> b -> m (Closure b)
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m) =>
a -> m (Closure a)
buildClosure

mapClosure :: (MonadTCEnv m, ReadTCState m) => (a -> m b) -> Closure a -> m (Closure b)
mapClosure :: (a -> m b) -> Closure a -> m (Closure b)
mapClosure = (Closure a -> (a -> m b) -> m (Closure b))
-> (a -> m b) -> Closure a -> m (Closure b)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Closure a -> (a -> m b) -> m (Closure b)
forall (m :: * -> *) a b.
(MonadTCEnv m, ReadTCState m) =>
Closure a -> (a -> m b) -> m (Closure b)
withClosure