{-# 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 m = FFI
{ FFI m -> ModuleName
ffi_moduleName :: P.ModuleName
, FFI m -> [ForeignImport m]
ffi_values :: [ForeignImport m]
}
data ForeignImport m = ForeignImport
{ ForeignImport m -> Ident
fv_name :: P.Ident
, ForeignImport m -> SourceType
fv_type :: P.SourceType
, ForeignImport m -> Value m
fv_value :: Value m
}
toExterns :: FFI m -> P.ExternsFile
toExterns :: FFI m -> ExternsFile
toExterns (FFI ModuleName
mn [ForeignImport m]
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 m
_ <- [ForeignImport m]
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 m
_ <- [ForeignImport m]
vals]
, efSourceSpan :: SourceSpan
Externs.efSourceSpan = SourceSpan
P.nullSourceSpan
}
toEnv :: FFI m -> Env m
toEnv :: FFI m -> Env m
toEnv (FFI ModuleName
mn [ForeignImport m]
vals) =
[(Qualified Ident, Value m)] -> Env m
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 m
val) | ForeignImport Ident
name SourceType
_ Value m
val <- [ForeignImport m]
vals ]