module TestSample (
  keybind
, errbind
, TestTalker
, Error( NotCmd )
, Config(..)
, myConfig
) where

import Control.EventDriven
import Data.Char ( isDigit )
import Control.Monad.State ( modify )

type TestTalker = Talker String Error Int

keybind, addmode :: String -> TalkMonad String Error Int ( Answer String Error Int )
keybind  "succ"  = do modify (+1)
                      answer givemeEvent
keybind  "add"   = do bind addmode
                      answer givemeEvent
keybind  "show"  = runVal givemeEvent
keybind  "quit"  = goodnight
keybind  _       = answer $ usrAnswer NotCmd

addmode s
  | all isDigit s = modify (+ read s) >> unbind >> answer givemeEvent
  | otherwise     = answer $ usrAnswer NotCmd

data Error = NotCmd

errbind :: Error -> IO ( TalkMonad String Error Int ( Answer String Error Int ) )
errbind NotCmd = do
  putStrLn "no such command"
  return $ answer givemeEvent

data Config = Config {
  initV  :: Int ,
  output :: Int -> IO Int ,
  input  :: IO String ,
  kbind  :: String -> TalkMonad String Error Int ( Answer String Error Int ) ,
  ebind  :: Error  -> IO ( TalkMonad String Error Int ( Answer String Error Int ) )
}

myConfig :: Config
myConfig = Config {
  initV  = 0 ,
  output = \n -> print n >> return n ,
  input  = getLine ,
  kbind  = keybind ,
  ebind  = errbind
}
