{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}
import System. Console. Haskeline
import Control
. Monad . State
. Strict
import qualified Data. ByteString. Char8 as B
import Data. List
import qualified Data. Map as M
data MyDataState = MyDataState {
instance MonadState s m => MonadState s ( InputT m) where
get = lift get
put = lift . put
state = lift . state
myfile :: FilePath
myfile = "data.txt"
defaultFlagValue = False
saveDataToFile
:: [ Int ] -> IO ( ) saveDataToFile
_ data
= withFile myfile WriteMode
$ \h
-> hPutStr h
( unwords $ map show _ data
)
{-# NOINLINE loadDataFromFile #-}
loadDataFromFile
:: [ Int ]
wordList = [ ":help" , ":q" , ":commands" , ":show" , ":save" , ":edit" , ":new" , ":toggleShowEven" ]
searchFunc
:: MyDataState
-> String -> [ Completion
] searchFunc
( MyDataState mydata showEven
) str
= map simpleCompletion
$ filter ( str `isPrefixOf`
) ( wordList
++ ( map show mydata
) )
mySettings
:: Settings
( StateT MyDataState
IO ) mySettings = Settings { historyFile = Just "myhist"
, complete = completeWord Nothing " \t " $ \str -> do
_ data <- get
searchFunc _ data str
--, complete = completeWord Nothing " \t" $ return . (searchFunc (MyDataState [] False) )
, autoAddHistory = True
}
help
:: InputT
( StateT MyDataState
IO ) ( ) [ ""
, ":help - this help"
, ":q - quit"
, ":commands - list available commands"
, ""
]
commands
:: InputT
( StateT MyDataState
IO ) ( ) [ ""
, ":show - display data"
, ":save - save results to file"
, ":edit - edit data"
, ":new - generate new element "
, ":toggleShowEven - toggle display of even elements"
, ""
]
toggleFlag
:: InputT
( StateT MyDataState
IO ) ( ) toggleFlag = do
MyDataState mydata flag <- get
put
$ MyDataState mydata
( not flag
)
parseInput
:: String -> InputT
( StateT MyDataState
IO ) ( ) parseInput inp
| ":help" == inp = help >> mainLoop
| ":commands" == inp = commands >> mainLoop
| ":toggleShowEven" == inp = toggleFlag >> mainLoop
| ":show" == inp = do
MyDataState mydata showEven <- get
mainLoop
| ":save" == inp = do
MyDataState mydata _ <- get
liftIO $ saveDataToFile mydata
mainLoop
| ":load" == inp = do
put ( MyDataState loadDataFromFile defaultFlagValue)
mainLoop
| ":new" == inp = do
MyDataState mydata showEven <- get -- reads the state
inputData <- getInputLine "\t Enter data: "
case inputData of
Nothing -> put ( MyDataState [ 0 ] showEven )
Just inputD ->
then MyDataState
[ read inputD
] showEven
else MyDataState
( mydata
++ [ read inputD
] ) showEven
-- updates the state mainLoop
| ":" == inp = do
outputStrLn $ "\n No command \" " ++ inp ++ "\" \n "
mainLoop
handleInput
:: String -> InputT
( StateT MyDataState
IO ) ( ) handleInput inp = mainLoop
mainLoop
:: InputT
( StateT MyDataState
IO ) ( ) mainLoop = do
inp <- getInputLine "% "
[ ""
, " MyProgram"
, "=============================="
, "For help type \" :help\" "
, ""
]
main
:: IO ( ( ) , MyDataState
) main = do
greet
runStateT ( runInputT mySettings mainLoop) MyDataState { mydata = [ ] , showEven = defaultFlagValue}
ey0jIExBTkdVQUdFIEZsZXhpYmxlSW5zdGFuY2VzLCBNdWx0aVBhcmFtVHlwZUNsYXNzZXMsIFVuZGVjaWRhYmxlSW5zdGFuY2VzICMtfQoKaW1wb3J0IFN5c3RlbS5Db25zb2xlLkhhc2tlbGluZQppbXBvcnQgU3lzdGVtLklPCmltcG9ydCBTeXN0ZW0uSU8uVW5zYWZlCmltcG9ydCBDb250cm9sLk1vbmFkLlN0YXRlLlN0cmljdAppbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5DaGFyOCBhcyBCCmltcG9ydCBEYXRhLk1heWJlCmltcG9ydCBEYXRhLkxpc3QgCmltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTQoKZGF0YSBNeURhdGFTdGF0ZSA9IE15RGF0YVN0YXRlIHsKICBteWRhdGEgOjogW0ludF0sCiAgc2hvd0V2ZW4gOjogQm9vbAp9IGRlcml2aW5nIChTaG93KQoKaW5zdGFuY2UgTW9uYWRTdGF0ZSBzIG0gPT4gTW9uYWRTdGF0ZSBzIChJbnB1dFQgbSkgd2hlcmUKICAgIGdldCA9IGxpZnQgZ2V0CiAgICBwdXQgPSBsaWZ0IC4gcHV0CiAgICBzdGF0ZSA9IGxpZnQgLiBzdGF0ZQoKbXlmaWxlIDo6IEZpbGVQYXRoCm15ZmlsZSA9ICJkYXRhLnR4dCIKCmRlZmF1bHRGbGFnVmFsdWUgOjogQm9vbApkZWZhdWx0RmxhZ1ZhbHVlID0gRmFsc2UKCnNhdmVEYXRhVG9GaWxlIDo6IFtJbnRdIC0+IElPICgpCnNhdmVEYXRhVG9GaWxlIF9kYXRhID0gd2l0aEZpbGUgbXlmaWxlIFdyaXRlTW9kZSAkIFxoIC0+IGhQdXRTdHIgaCAodW53b3JkcyAkIG1hcCBzaG93IF9kYXRhKQoKey0jIE5PSU5MSU5FIGxvYWREYXRhRnJvbUZpbGUgIy19IApsb2FkRGF0YUZyb21GaWxlIDo6IFtJbnRdCmxvYWREYXRhRnJvbUZpbGUgPSBtYXAgcmVhZCAuIHdvcmRzICQgQi51bnBhY2sgJCB1bnNhZmVQZXJmb3JtSU8gJCBCLnJlYWRGaWxlIG15ZmlsZQoKd29yZExpc3QgPSBbIjpoZWxwIiwgIjpxIiwgIjpjb21tYW5kcyIsICI6c2hvdyIsICI6c2F2ZSIsICI6ZWRpdCIsICI6bmV3IiwgIjp0b2dnbGVTaG93RXZlbiJdCgpzZWFyY2hGdW5jIDo6IE15RGF0YVN0YXRlIC0+IFN0cmluZyAtPiBbQ29tcGxldGlvbl0Kc2VhcmNoRnVuYyAoTXlEYXRhU3RhdGUgbXlkYXRhIHNob3dFdmVuKSBzdHIgPSBtYXAgc2ltcGxlQ29tcGxldGlvbiAkIGZpbHRlciAoc3RyIGBpc1ByZWZpeE9mYCkgKHdvcmRMaXN0ICsrIChtYXAgc2hvdyBteWRhdGEpKQoKbXlTZXR0aW5ncyA6OiBTZXR0aW5ncyAoU3RhdGVUIE15RGF0YVN0YXRlIElPKQpteVNldHRpbmdzID0gU2V0dGluZ3MgeyBoaXN0b3J5RmlsZSA9IEp1c3QgIm15aGlzdCIKICAgICAgICAgICAgICAgICAgICAgICwgY29tcGxldGUgPSBjb21wbGV0ZVdvcmQgTm90aGluZyAiIFx0IiAkIFxzdHIgLT4gZG8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgX2RhdGEgPC0gZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRnVuYyBfZGF0YSBzdHIgCiAgICAgICAgICAgICAgICAgICAgICAtLSwgY29tcGxldGUgPSBjb21wbGV0ZVdvcmQgTm90aGluZyAiIFx0IiAkIHJldHVybiAuIChzZWFyY2hGdW5jIChNeURhdGFTdGF0ZSBbXSBGYWxzZSkgKQogICAgICAgICAgICAgICAgICAgICAgLCBhdXRvQWRkSGlzdG9yeSA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgIH0KCmhlbHAgOjogSW5wdXRUIChTdGF0ZVQgTXlEYXRhU3RhdGUgSU8pICgpCmhlbHAgPSBsaWZ0SU8gJCBtYXBNXyBwdXRTdHJMbgogICAgICAgWyAiIgogICAgICAgLCAiOmhlbHAgICAgIC0gdGhpcyBoZWxwIgogICAgICAgLCAiOnEgICAgICAgIC0gcXVpdCIKICAgICAgICwgIjpjb21tYW5kcyAtIGxpc3QgYXZhaWxhYmxlIGNvbW1hbmRzIgogICAgICAgLCAiIgogICAgICAgXQogICAgICAgCmNvbW1hbmRzIDo6IElucHV0VCAoU3RhdGVUIE15RGF0YVN0YXRlIElPKSAoKQpjb21tYW5kcyA9IGxpZnRJTyAkIG1hcE1fIHB1dFN0ckxuCiAgICAgICBbICIiCiAgICAgICAsICI6c2hvdyAgICAgICAgICAgLSBkaXNwbGF5IGRhdGEiCiAgICAgICAsICI6c2F2ZSAgICAgICAgICAgLSBzYXZlIHJlc3VsdHMgdG8gZmlsZSIKICAgICAgICwgIjplZGl0ICAgICAgICAgICAtIGVkaXQgZGF0YSIKICAgICAgICwgIjpuZXcgICAgICAgICAgICAtIGdlbmVyYXRlIG5ldyBlbGVtZW50ICIKICAgICAgICwgIjp0b2dnbGVTaG93RXZlbiAtIHRvZ2dsZSBkaXNwbGF5IG9mIGV2ZW4gZWxlbWVudHMiCiAgICAgICAsICIiCiAgICAgICBdCgp0b2dnbGVGbGFnIDo6IElucHV0VCAoU3RhdGVUIE15RGF0YVN0YXRlIElPKSAoKQp0b2dnbGVGbGFnID0gZG8KICBNeURhdGFTdGF0ZSBteWRhdGEgZmxhZyA8LSBnZXQKICBwdXQgJCBNeURhdGFTdGF0ZSBteWRhdGEgKG5vdCBmbGFnKQoKcGFyc2VJbnB1dCA6OiBTdHJpbmcgLT4gSW5wdXRUIChTdGF0ZVQgTXlEYXRhU3RhdGUgSU8pICgpIApwYXJzZUlucHV0IGlucAogIHwgIjpxIiA9PSBpbnAgPSByZXR1cm4gKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIHwgIjpoZWxwIiA9PSBpbnAgPSBoZWxwID4+IG1haW5Mb29wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICB8ICI6Y29tbWFuZHMiID09IGlucCA9IGNvbW1hbmRzID4+IG1haW5Mb29wCiAgCiAgfCAiOnRvZ2dsZVNob3dFdmVuIiA9PSBpbnAgPSB0b2dnbGVGbGFnID4+IG1haW5Mb29wCiAgCiAgfCAiOnNob3ciID09IGlucCA9IGRvCiAgICAgIE15RGF0YVN0YXRlIG15ZGF0YSBzaG93RXZlbiA8LSBnZXQKICAgICAgbGlmdElPICQgcHV0U3RyTG4gJCB1bndvcmRzICQgaWYgc2hvd0V2ZW4gCiAgICAgICAgdGhlbiBtYXAgc2hvdyBteWRhdGEKICAgICAgICBlbHNlIG1hcCBzaG93ICQgZmlsdGVyIG9kZCBteWRhdGEKICAgICAgbWFpbkxvb3AgCgogIHwgIjpzYXZlIiA9PSBpbnAgPSBkbwogICAgICBNeURhdGFTdGF0ZSBteWRhdGEgXyA8LSBnZXQgCiAgICAgIGxpZnRJTyAkIHNhdmVEYXRhVG9GaWxlIG15ZGF0YQogICAgICBtYWluTG9vcAogICAgCiAgfCAiOmxvYWQiID09IGlucCA9IGRvCiAgICAgIHB1dCAoTXlEYXRhU3RhdGUgbG9hZERhdGFGcm9tRmlsZSBkZWZhdWx0RmxhZ1ZhbHVlKQogICAgICBtYWluTG9vcAoKICB8ICI6bmV3IiA9PSBpbnAgPSBkbwogICAgICBNeURhdGFTdGF0ZSBteWRhdGEgc2hvd0V2ZW4gPC0gZ2V0ICAgICAgICAgICAgICAgICAgICAgLS0gcmVhZHMgdGhlIHN0YXRlCiAgICAgIGlucHV0RGF0YSA8LSBnZXRJbnB1dExpbmUgIlx0RW50ZXIgZGF0YTogIgogICAgICBjYXNlIGlucHV0RGF0YSBvZiAKICAgICAgICBOb3RoaW5nIC0+IHB1dCAoIE15RGF0YVN0YXRlIFswXSBzaG93RXZlbiApCiAgICAgICAgSnVzdCBpbnB1dEQgLT4gCiAgICAgICAgICBwdXQgJCBpZiBudWxsIG15ZGF0YSAKICAgICAgICAgICAgdGhlbiBNeURhdGFTdGF0ZSBbcmVhZCBpbnB1dERdIHNob3dFdmVuCiAgICAgICAgICAgIGVsc2UgTXlEYXRhU3RhdGUgKG15ZGF0YSArKyBbcmVhZCBpbnB1dERdKSBzaG93RXZlbiAtLSB1cGRhdGVzIHRoZSBzdGF0ZQogICAgICBtYWluTG9vcAoKICB8ICI6IiA9PSBpbnAgPSBkbwogICAgb3V0cHV0U3RyTG4gJCAiXG5ObyBjb21tYW5kIFwiIiArKyBpbnAgKysgIlwiXG4iCiAgICBtYWluTG9vcAogICAgCiAgfCBvdGhlcndpc2UgPSBoYW5kbGVJbnB1dCBpbnAKCmhhbmRsZUlucHV0IDo6IFN0cmluZyAtPiBJbnB1dFQgKFN0YXRlVCBNeURhdGFTdGF0ZSBJTykgKCkKaGFuZGxlSW5wdXQgaW5wID0gbWFpbkxvb3AKCm1haW5Mb29wIDo6IElucHV0VCAoU3RhdGVUIE15RGF0YVN0YXRlIElPICkgKCkKbWFpbkxvb3AgPSBkbwogIGlucCA8LSBnZXRJbnB1dExpbmUgIiUgIgogIG1heWJlIChyZXR1cm4gKCkpIHBhcnNlSW5wdXQgaW5wCgpncmVldCA6OiBJTyAoKQpncmVldCA9IG1hcE1fIHB1dFN0ckxuCiAgICAgICAgWyAiIgogICAgICAgICwgIiAgICAgICAgICBNeVByb2dyYW0iCiAgICAgICAgLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICwgIkZvciBoZWxwIHR5cGUgXCI6aGVscFwiIgogICAgICAgICwgIiIKICAgICAgICBdCgptYWluIDo6IElPICgoKSwgTXlEYXRhU3RhdGUpCm1haW4gPSBkbyAKICAgIGdyZWV0IAogICAgcnVuU3RhdGVUIChydW5JbnB1dFQgbXlTZXR0aW5ncyBtYWluTG9vcCkgTXlEYXRhU3RhdGUge215ZGF0YSA9IFtdICwgc2hvd0V2ZW4gPSBkZWZhdWx0RmxhZ1ZhbHVlfQ==
compilation info
[1 of 1] Compiling Main ( prog.hs, prog.o )
prog.hs:42:36: error:
• Couldn't match type ‘[]’ with ‘StateT MyDataState IO’
Expected type: CompletionFunc (StateT MyDataState IO)
Actual type: CompletionFunc []
• In the ‘complete’ field of a record
In the expression:
Settings
{historyFile = Just "myhist",
complete = completeWord Nothing " \t"
$ \ str
-> do { _data <- get;
.... },
autoAddHistory = True}
In an equation for ‘mySettings’:
mySettings
= Settings
{historyFile = Just "myhist",
complete = completeWord Nothing " \t" $ \ str -> do { ... },
autoAddHistory = True}
prog.hs:44:27: error:
• Couldn't match type ‘Completion’ with ‘[Completion]’
Expected type: [[Completion]]
Actual type: [Completion]
• In a stmt of a 'do' block: searchFunc _data str
In the expression:
do { _data <- get;
searchFunc _data str }
In the second argument of ‘($)’, namely
‘\ str
-> do { _data <- get;
searchFunc _data str }’
stdout