{-# LANGUAGE Trustworthy #-} -- uses vector operations {-# LANGUAGE OverloadedRecordDot #-} module Language.Scalie.Compiler.Bytecode (EntryPoint, compile, CompilationError(..)) where import Language.Scalie.Core.Module (Module (definitions)) import Data.Text (Text) import Language.Scalie.Core.Provenance (Provenance (value, Provenance, source)) import Language.Scalie.Core.Provenance.SourceLocation (SourceLocation) import Language.Scalie.Bytecode.Object qualified as Bytecode import Data.Kind (Type) import Data.Either (Either (Left, Right)) import Data.Vector qualified as Vector import Control.Category ((.)) import Data.Function (($)) import Data.Functor ((<$>)) import Data.Map.Implicit qualified as ImplicitMap import Data.Maybe (Maybe(Nothing, Just)) import Language.Scalie.Core.Definition (Definition(body, name)) import Language.Scalie.Core.Expression (Expression(RawInt)) import Language.Scalie.Bytecode.Instruction qualified as Instruction import Prelude (undefined) -- | The name of the entrypoint function type EntryPoint :: Type type EntryPoint = Text type CompilationError :: Type newtype CompilationError = NameNotFound Text compile :: Module (Provenance SourceLocation) -> EntryPoint -> Either CompilationError Bytecode.Object compile mod entry = undefined {- let topLevelDefinitions = mod.definitions.value in Bytecode.Object . Vector.fromList <$> case ImplicitMap.lookup entry topLevelDefinitions of Nothing -> Left $ NameNotFound entry Just def -> Right [ (\(RawInt i) -> Instruction.PushInteger i) <$> def.body , Provenance def.name.source (Instruction.ReturnValues 1) ] -}