Skip to content

Stacking InputT leads to loss of functionality #158

@jrp2014

Description

@jrp2014

I have started with a n mtl stack type Forth w a r = ExceptT VMSignal (StateT (VM w a) IO) r and want to use haskeline to provide command line editing to my repl. I've refactored to use type Forth w a r = CME.ExceptT VMSignal (StateT (VM w a) (InputT IO)) r.

And functions which previously ran the stack now have calls like

repl :: (ForthType a, Eq a) => VM w a -> ForthStep w a -> IO ()
repl vm initF = do
  catchSigint vm
  let behaviour = maybe defaultBehavior useFileHandle (inputPort vm)
  (r, vm') <- runInputTBehavior behaviour
                                defaultSettings
                                (runStateT (runExceptT initF) vm)
:

and

fwRefill :: ForthStep w a
fwRefill = do
  vm <- getVm
  case inputPort vm of
    Nothing -> throwError VMNoInput
    Just h  -> do
--      eof <- liftIO (hIsEOF h)
--      when eof (CME.throwError VMEOF)
      trace 2 "REFILL"
      line <- runInputTBehavior (useFileHandle h) defaultSettings
        $ getInputLine "> "
      maybe (throwError VMEOF) (\b -> put (vm { buffer = b })) line
      next

The program works as before (and the > prompt appears. but I can't scroll back into history and the arrow keys still don't work (you get > ^[[A on pushing the up arrow, for example (as before). I don't want to put the InputT on the outside as I'd then have to sprinkle all my code with lifts, which I'd prefer to avoid.

What can I do to get command line editing to function, please?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions