summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/REPL.hs
blob: a5ffce1807576f19b7a48fd70c4c44dcc5969a9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC "-fno-warn-orphans" #-}

module Minilang.REPL where

import Control.Monad.Catch.Pure (CatchT (..))
import Control.Monad.State
import Data.Text hiding (replicate)
import Minilang.REPL.Haskeline
import Minilang.REPL.IO
import Minilang.REPL.Pure
import Minilang.REPL.Purer
import Minilang.REPL.Run
import Minilang.REPL.Types
import System.Console.Haskeline (
    defaultBehavior,
    defaultSettings,
    historyFile,
    runInputTBehavior,
    setComplete,
 )
import System.IO (Handle)

-- * Haskeline REPL

withTerminal :: IO ()
withTerminal =
    runInputTBehavior defaultBehavior settings $ evalStateT (runHaskeline runREPL) initialREPL
  where
    settings = setComplete completion $ defaultSettings{historyFile = Just "~/.minilang.history"}

-- * Other REPLs

{- | Pure IO REPL
 Used for testing purposes
-}

-- |
withHandles ::
    Handle -> Handle -> IO ()
withHandles hin hout =
    evalStateT (runConsole runREPL) (IOEnv hin hout initialREPL)

-- * Pure REPL

withInput ::
    [Text] -> [Text]
withInput stream =
    outputText $ execState (runCatchT (runPure runREPL)) (PureEnv stream [] initialREPL)
-- * Purer REPL

-- This useful for rehydrating and environment from a sequence of inputs

withInputs ::
    REPLEnv -> [In] -> PurerEnv
withInputs initEnv stream =
    execState (runCatchT (runPurer runREPL)) (PurerEnv stream [] initEnv)