content: {- |
  Module      : ./CMDL/UndoRedo.hs
  Description : description of undo and redo functions
  Copyright   : uni-bremen and DFKI
  License     : GPLv2 or higher, see LICENSE.txt
  Maintainer  : r.pascanu@jacobs-university.de
  Stability   : provisional
  Portability : portable
  
  CMDL.UnDoRedo contains the implementation of the undo and redo commads
  -}
  
  
  module CMDL.UndoRedo
         ( cUndo
         , cRedo
         ) where
  
  
  import Interfaces.History (redoOneStep, undoOneStep)
  import Interfaces.Command (showCmd)
  import Interfaces.DataTypes
  
  import CMDL.DataTypesUtils (genMessage)
  import CMDL.DataTypes (CmdlState (intState))
  
  -- | Undoes the last command entered
  cUndo :: CmdlState -> IO CmdlState
  cUndo = cdo True
  
  -- | Redoes the last undo command
  cRedo :: CmdlState -> IO CmdlState
  cRedo = cdo False
  
  cdo :: Bool -> CmdlState -> IO CmdlState
  cdo isUndo state =
     let msg = (if isUndo then "un" else "re") ++ "do"
     in case (if isUndo then undoList else redoList) . i_hist $ intState state of
      [] -> return $ genMessage [] ("Nothing to " ++ msg) state
      action : _ ->
        do
         nwIntState <- (if isUndo then undoOneStep else redoOneStep)
           $ intState state
         return . genMessage [] ("Action '" ++ showCmd (command action)
                                 ++ "' is now " ++ msg ++ "ne")
                $ state { intState = nwIntState }
  