1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-30 19:14:46 +03:00
juvix/app/Commands/Eval.hs

40 lines
1.4 KiB
Haskell
Raw Normal View History

module Commands.Eval where
import Commands.Base
import Commands.Eval.Options
import Evaluator qualified as Eval
import Juvix.Compiler.Core qualified as Core
import Juvix.Compiler.Core.Data.InfoTable qualified as Core
import Juvix.Compiler.Core.Language qualified as Core
import Juvix.Compiler.Core.Pipeline qualified as Core
runCommand :: (Members '[Embed IO, App] r) => EvalOptions -> Sem r ()
runCommand opts@EvalOptions {..} = do
Core.CoreResult {..} <- runPipeline _evalInputFile upToCore
r <- runError @JuvixError $ Core.toEval _coreResultTable
tab <- getRight r
let evalNode =
if
| isJust (_evalSymbolName) -> getNode' tab (selInfo tab)
| otherwise -> getNode' tab (mainInfo tab)
Eval.evalAndPrint opts tab evalNode
where
mainInfo :: Core.InfoTable -> Maybe Core.IdentifierInfo
mainInfo tab = do
s <- tab ^. Core.infoMain
tab ^. Core.infoIdentifiers . at s
selInfo :: Core.InfoTable -> Maybe Core.IdentifierInfo
selInfo tab = do
s <- _evalSymbolName
find (^. Core.identifierName . to (== s)) (tab ^. Core.infoIdentifiers)
getNode' :: Core.InfoTable -> Maybe Core.IdentifierInfo -> Core.Node
getNode' tab m = fromMaybe err (getNode tab m)
getNode :: Core.InfoTable -> Maybe Core.IdentifierInfo -> Maybe Core.Node
getNode tab m = m >>= \i -> tab ^. Core.identContext . at (i ^. Core.identifierSymbol)
err :: a
err = error "function not found"