packages feed

seihou-core-0.4.0.0: src/Seihou/Effect/DhallEvalInterp.hs

module Seihou.Effect.DhallEvalInterp
  ( runDhallEval,
    runDhallEvalPure,
  )
where

import Data.Map.Strict qualified as Map
import Seihou.Core.Types (Module, ModuleLoadError (..))
import Seihou.Dhall.Eval (evalModuleFromFile)
import Seihou.Effect.DhallEval (DhallEval (..))
import Seihou.Prelude

-- | Real interpreter that evaluates Dhall files from disk.
runDhallEval :: (IOE :> es) => Eff (DhallEval : es) a -> Eff es a
runDhallEval = interpret $ \_ -> \case
  EvalModuleFile path -> liftIO (evalModuleFromFile path)

-- | Pure test interpreter that looks up modules from an in-memory map.
-- The map keys are file paths; if a path is not found, an error is raised.
runDhallEvalPure :: Map FilePath Module -> Eff (DhallEval : es) a -> Eff es a
runDhallEvalPure modules = interpret $ \_ -> \case
  EvalModuleFile path ->
    case Map.lookup path modules of
      Just m -> pure (Right m)
      Nothing -> error ("runDhallEvalPure: no module at path: " <> path)