module Agda.TypeChecking.Monad.Open
( makeOpen
, makeClosed
, getOpen
, tryOpen
) where
import Control.Applicative
import Control.Monad
import Control.Monad.Error
import Data.List
import Agda.TypeChecking.Substitute
import Agda.TypeChecking.Monad.Base
import Agda.TypeChecking.Monad.Context
makeOpen :: a -> TCM (Open a)
makeOpen x = do
ctx <- getContextId
return $ OpenThing ctx x
makeClosed :: a -> Open a
makeClosed = OpenThing []
getOpen :: Subst a => Open a -> TCM a
getOpen (OpenThing [] x) = return x
getOpen (OpenThing ctx x) = do
ctx' <- getContextId
unless (ctx `isSuffixOf` ctx') $ fail $ "thing out of context (" ++ show ctx ++ " is not a sub context of " ++ show ctx' ++ ")"
return $ raise (genericLength ctx' genericLength ctx) x
tryOpen :: Subst a => Open a -> TCM (Maybe a)
tryOpen o =
(Just <$> getOpen o)
`catchError` \_ -> return Nothing