agda2hs-1.0: src/Agda2Hs/Compile/TypeDefinition.hs
module Agda2Hs.Compile.TypeDefinition where
import Control.Monad ( unless )
import Data.Maybe ( fromMaybe )
import qualified Language.Haskell.Exts.Syntax as Hs
import Agda.Compiler.Backend
import Agda.Syntax.Common ( namedArg )
import Agda.Syntax.Internal
import Agda.Utils.Impossible ( __IMPOSSIBLE__ )
import Agda.Utils.Monad
import Agda2Hs.Compile.Term ( compileVar )
import Agda2Hs.Compile.Type ( compileType )
import Agda2Hs.Compile.Types
import Agda2Hs.Compile.Utils
import Agda2Hs.HsUtils
compileTypeDef :: Hs.Name () -> Definition -> C [Hs.Decl ()]
compileTypeDef name (Defn {..}) = do
unlessM (isTransparentFunction defName) $ checkValidTypeName name
Clause{..} <- singleClause funClauses
addContext (KeepNames clauseTel) $ do
as <- compileTypeArgs namedClausePats
let hd = foldl (Hs.DHApp ()) (Hs.DHead () name) as
rhs <- compileType $ fromMaybe __IMPOSSIBLE__ clauseBody
return [Hs.TypeDecl () hd rhs]
where
Function{..} = theDef
singleClause = \case
[cl] -> return cl
_ -> genericError "Not supported: type definition with several clauses"
compileTypeArgs :: NAPs -> C [Hs.TyVarBind ()]
compileTypeArgs ps = mapM (compileTypeArg . namedArg) $ filter keepArg ps
compileTypeArg :: DeBruijnPattern -> C (Hs.TyVarBind ())
compileTypeArg p@(VarP o i) = do
name <- hsName <$> compileVar (dbPatVarIndex i)
checkValidTyVarName name
return $ Hs.UnkindedVar () name
compileTypeArg _ = genericError "Not supported: type definition by pattern matching"