I’m trying to use streamly-process
to communicate with some GHCi instance running in the background. I came up with the following code :
import Data.Word
import qualified Streamly.Data.Stream.Prelude as Stream
import qualified Streamly.Data.Fold.Prelude as Fold
import qualified Streamly.System.Process as Process
import qualified Streamly.Console.Stdio as Stdio
import qualified Streamly.Data.Array.Foreign as Array
stringToByteArray :: String -> Array.Array Word8
stringToByteArray = Array.fromList . map (fromIntegral . fromEnum)
-- a version of getLine that does not ignore the newline character.
getNewLn :: IO String
getNewLn = fmap (++ "n") getLine
main :: IO ()
main = do
Stream.fold (Fold.takeEndBy ( == stringToByteArray "Leaving GHCi.") Stdio.writeChunks) $
Process.pipeChunks "ghci" [] $
fmap stringToByteArray $
Stream.repeatM getNewLn
-- When using Stream.fromList, it works ! To do so, uncomment the following :
-- Stream.fromList ["putStrLn "This works ! "n", " 3 + 4n"
When I use fromList
, it works as expected and returns :
GHCi, version 9.8.2: https://www.haskell.org/ghc/ :? for help
ghci> This works !
ghci> 7
ghci> Leaving GHCi.
However, when I’m using getNewLn
this is what I get :
GHCi, version 9.8.2: https://www.haskell.org/ghc/ :? for help
ghci> I'm typing
the return key
several times
but nothing happens ...
What did I get wrong ?