{-# 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