--------------------------------------------------------------------------------
--                                                                            --
-- interactive IO                                                             --
--                                                                            --
--------------------------------------------------------------------------------

primitive primIOReturn "primSTReturn" :: a -> IO a
primitive primIOBind   "primIOBind"   :: IO a -> (a -> IO b) -> IO b

instance Monad IO where
  result = primIOReturn
  bind = primIOBind

instance Functor IO where
  map f m = do { x <- m ; result (f x) }

-- IOMonad

class Monad m => IOMonad m where
  getch :: m Char
  putchar :: Char -> m ()

getchar :: IOMonad m => m Char
getchar = do { ch <- getch ; putchar ch ; result ch } 

primitive primIOGetch   "primIOGetch"   :: IO Char
primitive primIOPutchar "primIOPutchar" :: Char -> IO ()

instance IOMonad IO where
  getch = primIOGetch
  putchar = primIOPutchar
           
-- useful IO functions

putstring :: IOMonad m => String -> m ()
putstring str = doAll (map putchar str) 

putint :: IOMonad m => Int -> m ()
putint n = putstring (show n)          

-- Put class

class Put x where 
  put :: x -> IO ()

instance Put Char where
  put = putchar

instance Put String where
  put = putstring

instance Text x => Put x where
  put = put . show

-- useful IO function

getline :: IOMonad m => m String
getline = doWhile (/= '\n') getchar  

--------------------------------------------------------------------------------
