less prototype, less bad code implementation of CCHM type theory
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.6 KiB

  1. {-# LANGUAGE CPP #-}
  2. module Web where
  3. import Control.Exception.Base
  4. import Control.Monad.Reader
  5. import qualified Data.ByteString.Lazy as Bsl
  6. import qualified Data.Text.Encoding as T
  7. import qualified Data.Map.Strict as Map
  8. import qualified Data.Text as T
  9. import Elab.Eval (zonkIO, force)
  10. import Elab.Monad
  11. import Elab
  12. import Foreign
  13. import Presyntax.Presyntax
  14. import Presyntax.Parser
  15. import Presyntax.Lexer
  16. import Syntax.Pretty
  17. import Syntax
  18. #ifdef ASTERIUS
  19. import Asterius.Types
  20. import Asterius.Aeson
  21. #endif
  22. parseFromString :: String -> IO (StablePtr [Statement])
  23. parseFromString str = do
  24. case runAlex (Bsl.fromStrict (T.encodeUtf8 inp)) parseProg of
  25. Right e -> newStablePtr e
  26. Left e -> throwIO (ErrorCall e)
  27. where
  28. inp = T.pack str
  29. newEnvironment :: IO (StablePtr ElabEnv)
  30. newEnvironment = newStablePtr =<< emptyEnv
  31. typeCheckProgram :: StablePtr ElabEnv -> StablePtr [Statement] -> IO (StablePtr ElabEnv)
  32. typeCheckProgram envP prog =
  33. do
  34. prog <- deRefStablePtr prog
  35. env <- runElab (go prog) =<< deRefStablePtr envP
  36. newStablePtr env
  37. where
  38. go prog = checkProgram prog ask
  39. getTypeByName :: String -> StablePtr ElabEnv -> IO (StablePtr Value)
  40. getTypeByName str env = do
  41. env <- deRefStablePtr env
  42. case Map.lookup (T.pack str) (nameMap env) of
  43. Just nm -> newStablePtr (fst (getEnv env Map.! nm))
  44. Nothing -> throwIO (NotInScope (Bound (T.pack str) 0))
  45. getValueByName :: String -> StablePtr ElabEnv -> IO (StablePtr Value)
  46. getValueByName str env = do
  47. env <- deRefStablePtr env
  48. case Map.lookup (T.pack str) (nameMap env) of
  49. Just nm -> newStablePtr (snd (getEnv env Map.! nm))
  50. Nothing -> throwIO (NotInScope (Bound (T.pack str) 0))
  51. classifyValue :: StablePtr Value -> IO String
  52. classifyValue val = do
  53. t <- deRefStablePtr val
  54. pure $ case force t of
  55. VNe (HData pathcs _) _
  56. | pathcs -> "data.higher"
  57. | otherwise -> "data"
  58. VNe (HCon _ _) _ -> "constr"
  59. _ -> "other"
  60. classifyValueByName :: String -> StablePtr ElabEnv -> IO String
  61. classifyValueByName str env = do
  62. env <- deRefStablePtr env
  63. case Map.lookup (T.pack str) (nameMap env) of
  64. Just nm ->
  65. pure $ case force (snd (getEnv env Map.! nm)) of
  66. VNe (HData pathcs _) _
  67. | pathcs -> "constr.data.higher"
  68. | otherwise -> "constr.data"
  69. VNe HPCon{} _ -> "constr.higher"
  70. VNe HCon{} _ -> "constr"
  71. _ -> "other"
  72. Nothing -> throwIO $ NotInScope (Bound (T.pack str) 0)
  73. findDefinition :: String -> StablePtr ElabEnv -> IO (Maybe (Posn, Posn))
  74. findDefinition str env = do
  75. env <- deRefStablePtr env
  76. case Map.lookup (T.pack str) (nameMap env) of
  77. Just nm -> pure $ Map.lookup nm (whereBound env)
  78. Nothing -> throwIO $ NotInScope (Bound (T.pack str) 0)
  79. zonkAndShowType :: StablePtr Value -> IO String
  80. zonkAndShowType val = do
  81. val <- deRefStablePtr val
  82. val <- zonkIO val
  83. let str = show . prettyTm . quote $ val
  84. pure str
  85. freeHaskellValue :: StablePtr a -> IO ()
  86. freeHaskellValue = freeStablePtr
  87. #ifdef ASTERIUS
  88. parseFromStringJs :: JSString -> IO (StablePtr [Statement])
  89. parseFromStringJs = parseFromString . fromJSString
  90. getTypeByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
  91. getTypeByNameJs str env = getTypeByName (fromJSString str) env
  92. getValueByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
  93. getValueByNameJs str env = getValueByName (fromJSString str) env
  94. zonkAndShowTypeJs :: StablePtr Value -> IO JSString
  95. zonkAndShowTypeJs = fmap toJSString . zonkAndShowType
  96. classifyValueByNameJs :: JSString -> StablePtr ElabEnv -> IO JSString
  97. classifyValueByNameJs str env = toJSString <$> classifyValueByName (fromJSString str) env
  98. findDefinitionJs :: JSString -> StablePtr ElabEnv -> IO JSVal
  99. findDefinitionJs str env = jsonToJSVal <$> findDefinition (fromJSString str) env
  100. foreign export javascript parseFromStringJs :: JSString -> IO (StablePtr [Statement])
  101. foreign export javascript getTypeByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
  102. foreign export javascript getValueByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
  103. foreign export javascript classifyValueByNameJs :: JSString -> StablePtr ElabEnv -> IO JSString
  104. foreign export javascript newEnvironment :: IO (StablePtr ElabEnv)
  105. foreign export javascript typeCheckProgram :: StablePtr ElabEnv -> StablePtr [Statement] -> IO (StablePtr ElabEnv)
  106. foreign export javascript zonkAndShowTypeJs :: StablePtr Value -> IO JSString
  107. foreign export javascript freeHaskellValue :: StablePtr Value -> IO ()
  108. foreign export javascript findDefinitionJs :: JSString -> StablePtr ElabEnv -> IO JSVal
  109. #endif