-- | to manage reverting of commands
module Azubi.Core.Revertable where

import Azubi.Core.Context


-- | Revertable context is for to implement
-- | revertable Actions
class Context a => Revertable a where

  -- | toggle reverting
  toggleRevert :: a -> a

  -- | should revert an action
  -- | eg: uninstall
  isRevert :: a -> Bool

  setRevert :: a -> a
  setRevert context =
    if (isRevert context)
    then context
    else toggleRevert context

  -- | should execute an action
  -- | eg: install
  isExecute :: a -> Bool
  isExecute context = not $ isRevert context

  setExectue :: a -> a
  setExectue context =
    if (isExecute context)
    then context
    else toggleRevert context