|
|
- {-# LANGUAGE CPP #-}
- module Web where
-
- import Control.Exception.Base
- import Control.Monad.Reader
-
- import qualified Data.ByteString.Lazy as Bsl
- import qualified Data.Text.Encoding as T
- import qualified Data.Map.Strict as Map
- import qualified Data.Text as T
-
- import Elab.Eval (zonkIO, force)
- import Elab.Monad
- import Elab
-
- import Foreign
-
- import Presyntax.Presyntax
- import Presyntax.Parser
- import Presyntax.Lexer
-
- import Syntax.Pretty
- import Syntax
-
- #ifdef ASTERIUS
- import Asterius.Types
- import Asterius.Aeson
- #endif
-
- parseFromString :: String -> IO (StablePtr [Statement])
- parseFromString str = do
- case runAlex (Bsl.fromStrict (T.encodeUtf8 inp)) parseProg of
- Right e -> newStablePtr e
- Left e -> throwIO (ErrorCall e)
- where
- inp = T.pack str
-
- newEnvironment :: IO (StablePtr ElabEnv)
- newEnvironment = newStablePtr =<< emptyEnv
-
- typeCheckProgram :: StablePtr ElabEnv -> StablePtr [Statement] -> IO (StablePtr ElabEnv)
- typeCheckProgram envP prog =
- do
- prog <- deRefStablePtr prog
- env <- runElab (go prog) =<< deRefStablePtr envP
- newStablePtr env
- where
- go prog = checkProgram prog ask
-
- getTypeByName :: String -> StablePtr ElabEnv -> IO (StablePtr Value)
- getTypeByName str env = do
- env <- deRefStablePtr env
- case Map.lookup (T.pack str) (nameMap env) of
- Just nm -> newStablePtr (fst (getEnv env Map.! nm))
- Nothing -> throwIO (NotInScope (Bound (T.pack str) 0))
-
- getValueByName :: String -> StablePtr ElabEnv -> IO (StablePtr Value)
- getValueByName str env = do
- env <- deRefStablePtr env
- case Map.lookup (T.pack str) (nameMap env) of
- Just nm -> newStablePtr (snd (getEnv env Map.! nm))
- Nothing -> throwIO (NotInScope (Bound (T.pack str) 0))
-
- classifyValue :: StablePtr Value -> IO String
- classifyValue val = do
- t <- deRefStablePtr val
- pure $ case force t of
- VNe (HData pathcs _) _
- | pathcs -> "data.higher"
- | otherwise -> "data"
- VNe (HCon _ _) _ -> "constr"
- _ -> "other"
-
- classifyValueByName :: String -> StablePtr ElabEnv -> IO String
- classifyValueByName str env = do
- env <- deRefStablePtr env
- case Map.lookup (T.pack str) (nameMap env) of
- Just nm ->
- pure $ case force (snd (getEnv env Map.! nm)) of
- VNe (HData pathcs _) _
- | pathcs -> "constr.data.higher"
- | otherwise -> "constr.data"
- VNe HPCon{} _ -> "constr.higher"
- VNe HCon{} _ -> "constr"
- _ -> "other"
- Nothing -> throwIO $ NotInScope (Bound (T.pack str) 0)
-
- findDefinition :: String -> StablePtr ElabEnv -> IO (Maybe (Posn, Posn))
- findDefinition str env = do
- env <- deRefStablePtr env
- case Map.lookup (T.pack str) (nameMap env) of
- Just nm -> pure $ Map.lookup nm (whereBound env)
- Nothing -> throwIO $ NotInScope (Bound (T.pack str) 0)
-
- zonkAndShowType :: StablePtr Value -> IO String
- zonkAndShowType val = do
- val <- deRefStablePtr val
- val <- zonkIO val
- let str = show . prettyTm . quote $ val
- pure str
-
- freeHaskellValue :: StablePtr a -> IO ()
- freeHaskellValue = freeStablePtr
-
- #ifdef ASTERIUS
-
- parseFromStringJs :: JSString -> IO (StablePtr [Statement])
- parseFromStringJs = parseFromString . fromJSString
-
- getTypeByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
- getTypeByNameJs str env = getTypeByName (fromJSString str) env
-
- getValueByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
- getValueByNameJs str env = getValueByName (fromJSString str) env
-
- zonkAndShowTypeJs :: StablePtr Value -> IO JSString
- zonkAndShowTypeJs = fmap toJSString . zonkAndShowType
-
- classifyValueByNameJs :: JSString -> StablePtr ElabEnv -> IO JSString
- classifyValueByNameJs str env = toJSString <$> classifyValueByName (fromJSString str) env
-
- findDefinitionJs :: JSString -> StablePtr ElabEnv -> IO JSVal
- findDefinitionJs str env = jsonToJSVal <$> findDefinition (fromJSString str) env
-
- foreign export javascript parseFromStringJs :: JSString -> IO (StablePtr [Statement])
- foreign export javascript getTypeByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
- foreign export javascript getValueByNameJs :: JSString -> StablePtr ElabEnv -> IO (StablePtr Value)
- foreign export javascript classifyValueByNameJs :: JSString -> StablePtr ElabEnv -> IO JSString
- foreign export javascript newEnvironment :: IO (StablePtr ElabEnv)
- foreign export javascript typeCheckProgram :: StablePtr ElabEnv -> StablePtr [Statement] -> IO (StablePtr ElabEnv)
- foreign export javascript zonkAndShowTypeJs :: StablePtr Value -> IO JSString
- foreign export javascript freeHaskellValue :: StablePtr Value -> IO ()
- foreign export javascript findDefinitionJs :: JSString -> StablePtr ElabEnv -> IO JSVal
-
- #endif
|