{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} module Axel.Test.Eff.GhciMock where import Axel.Eff.Ghci as Effs import Axel.Test.MockUtils import Control.Lens import Control.Monad.Freer import Control.Monad.Freer.Error as Effs import Control.Monad.Freer.State as Effs data GhciState = GhciState { _ghciExecutionLog :: [String] , _ghciMockResults :: [[String]] } deriving (Eq, Show) makeFieldsNoPrefix ''GhciState mkGhciState :: [[String]] -> GhciState mkGhciState = GhciState [] runGhci :: forall effs a. (Member (Effs.Error String) effs) => GhciState -> Eff (Effs.Ghci ': effs) a -> Eff effs (a, GhciState) runGhci origState action = runState origState $ reinterpret go action where go :: Ghci b -> Eff (Effs.State GhciState ': effs) b go (Exec _ command) = do modify @GhciState $ ghciExecutionLog %~ (|> command) gets @GhciState (uncons . (^. ghciMockResults)) >>= \case Just (mockResult, newMockResults) -> do modify @GhciState $ ghciMockResults .~ newMockResults pure mockResult Nothing -> throwInterpretError @GhciState "Exec" "No mock result available" go Start = undefined go (Stop _) = undefined