{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE OverloadedStrings #-}
module Dovetail.FFI
(
FFI(..)
, ForeignImport(..)
, toEnv
, toExterns
) where
import Data.Map qualified as Map
import Dovetail.Types
import Language.PureScript qualified as P
import Language.PureScript.Externs qualified as Externs
data FFI ctx = FFI
{ FFI ctx -> ModuleName
ffi_moduleName :: P.ModuleName
, FFI ctx -> [ForeignImport ctx]
ffi_values :: [ForeignImport ctx]
}
data ForeignImport ctx = ForeignImport
{ ForeignImport ctx -> Ident
fv_name :: P.Ident
, ForeignImport ctx -> SourceType
fv_type :: P.SourceType
, ForeignImport ctx -> Value ctx
fv_value :: Value ctx
}
toExterns :: FFI ctx -> P.ExternsFile
toExterns :: FFI ctx -> ExternsFile
toExterns (FFI ModuleName
mn [ForeignImport ctx]
vals) =
ExternsFile :: Text
-> ModuleName
-> [DeclarationRef]
-> [ExternsImport]
-> [ExternsFixity]
-> [ExternsTypeFixity]
-> [ExternsDeclaration]
-> SourceSpan
-> ExternsFile
Externs.ExternsFile
{ efVersion :: Text
Externs.efVersion = Text
"0.14.2"
, efModuleName :: ModuleName
Externs.efModuleName = ModuleName
mn
, efExports :: [DeclarationRef]
Externs.efExports = [SourceSpan -> Ident -> DeclarationRef
P.ValueRef SourceSpan
P.nullSourceSpan Ident
name | ForeignImport Ident
name SourceType
_ Value ctx
_ <- [ForeignImport ctx]
vals]
, efImports :: [ExternsImport]
Externs.efImports = [ ModuleName
-> ImportDeclarationType -> Maybe ModuleName -> ExternsImport
P.ExternsImport (Text -> ModuleName
P.ModuleName Text
"Prim") ImportDeclarationType
P.Implicit (ModuleName -> Maybe ModuleName
forall a. a -> Maybe a
Just (Text -> ModuleName
P.ModuleName Text
"Prim"))
, ModuleName
-> ImportDeclarationType -> Maybe ModuleName -> ExternsImport
P.ExternsImport (Text -> ModuleName
P.ModuleName Text
"Prim") ImportDeclarationType
P.Implicit Maybe ModuleName
forall a. Maybe a
Nothing
]
, efFixities :: [ExternsFixity]
Externs.efFixities = []
, efTypeFixities :: [ExternsTypeFixity]
Externs.efTypeFixities = []
, efDeclarations :: [ExternsDeclaration]
Externs.efDeclarations = [Ident -> SourceType -> ExternsDeclaration
Externs.EDValue Ident
name SourceType
ty | ForeignImport Ident
name SourceType
ty Value ctx
_ <- [ForeignImport ctx]
vals]
, efSourceSpan :: SourceSpan
Externs.efSourceSpan = SourceSpan
P.nullSourceSpan
}
toEnv :: FFI ctx -> Env ctx
toEnv :: FFI ctx -> Env ctx
toEnv (FFI ModuleName
mn [ForeignImport ctx]
vals) =
Map (Qualified Ident) (Value ctx) -> Env ctx
forall ctx. Map (Qualified Ident) (Value ctx) -> Env ctx
envFromMap (Map (Qualified Ident) (Value ctx) -> Env ctx)
-> Map (Qualified Ident) (Value ctx) -> Env ctx
forall a b. (a -> b) -> a -> b
$ [(Qualified Ident, Value ctx)] -> Map (Qualified Ident) (Value ctx)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [ (Ident -> ModuleName -> Qualified Ident
forall a. a -> ModuleName -> Qualified a
P.mkQualified Ident
name ModuleName
mn, Value ctx
val) | ForeignImport Ident
name SourceType
_ Value ctx
val <- [ForeignImport ctx]
vals ]