prompt: added history file draft

This commit is contained in:
2017-05-19 13:30:00 -04:00
parent 7b85c63b43
commit c666fb453d
3 changed files with 37 additions and 5 deletions

View File

@@ -14,6 +14,6 @@ cabal-version: >=1.10
executable bc executable bc
main-is: Main.hs main-is: Main.hs
hs-source-dirs: src/ hs-source-dirs: src/
build-depends: base >=4.9 && <4.10, hashmap, parsec, unix build-depends: base >=4.9 && <4.10, directory, hashmap, parsec, unix
hs-source-dirs: src hs-source-dirs: src
default-language: Haskell2010 default-language: Haskell2010

View File

@@ -5,3 +5,5 @@ versionStr = "0.1.0.0"
promptStr = "> " promptStr = "> "
returnStr = "=> " returnStr = "=> "
historyFile = ".bc_history"

View File

@@ -2,6 +2,8 @@ module BC.Prompt (startPrompt) where
import Control.Monad (unless) import Control.Monad (unless)
import Data.Char import Data.Char
import Data.List
import System.Directory (doesFileExist, getHomeDirectory)
import System.IO import System.IO
import System.Posix.Signals import System.Posix.Signals
@@ -15,6 +17,28 @@ import BC.Types
data Prompt = PState Int [String] data Prompt = PState Int [String]
newPrompt :: IO Prompt
newPrompt = do
home <- getHomeDirectory
let f = home ++ "/" ++ historyFile
exists <- doesFileExist f
if exists
then do
contents <- readFile f
return $ PState (-1) (split contents)
else return $ PState (-1) []
where split [] = []
split s = takeWhile (/= '\n') s : split (dropWhile (/= '\n') s)
savePrompt :: Prompt -> IO ()
savePrompt (PState _ strs) = do
home <- getHomeDirectory
f <- openFile (home ++ "/" ++ historyFile) WriteMode
hPrint f (intercalate "\n" strs)
hClose f
printHeader :: IO () printHeader :: IO ()
printHeader = do printHeader = do
putStrLn $ "bc (better calculator) version " ++ versionStr putStrLn $ "bc (better calculator) version " ++ versionStr
@@ -124,12 +148,16 @@ readline state = read' "" 0
| otherwise = n | otherwise = n
prompt :: State -> Prompt -> IO () prompt :: State -> Prompt -> IO Prompt
prompt state pstate@(PState _ history) = do prompt state pstate@(PState _ history) = do
input <- readline state pstate input <- readline state pstate
case input of case input of
Nothing -> putStrLn "\nBye!" Nothing -> do
Just "quit" -> putStrLn "\nBye!" putStrLn "\nBye!"
return pstate
Just "quit" -> do
putStrLn "\nBye!"
return pstate
Just str -> do Just str -> do
putStrLn "" putStrLn ""
newstate <- output state str newstate <- output state str
@@ -149,4 +177,6 @@ startPrompt :: IO ()
startPrompt = do startPrompt = do
printHeader printHeader
installHandlers installHandlers
prompt newState (PState (-1) []) p <- newPrompt
state <- prompt newState p
savePrompt state