{-# LANGUAGE DeriveDataTypeable, RecordWildCards, TemplateHaskell, TypeFamilies #-}
module Clckwrks.IrcBot.Acid where

import Clckwrks.IrcBot.Types  (IrcConfig(..))
import Control.Applicative    ((<$>))
import Control.Monad.Reader   (ask)
import Control.Monad.State    (modify)
import Data.Acid              (Query, Update, makeAcidic)
import Data.Data              (Data, Typeable)
import Data.IxSet             (IxSet, (@=), getOne, empty, toList, updateIx)
import Data.SafeCopy          (base, deriveSafeCopy)


data IrcBotState = IrcBotState
    { ircConfig :: IrcConfig
    }
    deriving (Eq, Ord, Read, Show, Data, Typeable)
$(deriveSafeCopy 0 'base ''IrcBotState)

initialIrcBotState :: IrcConfig -> IrcBotState
initialIrcBotState initConfig
    = IrcBotState
      { ircConfig = initConfig
      }

getIrcConfig :: Query IrcBotState IrcConfig
getIrcConfig = ircConfig <$> ask

setIrcConfig :: IrcConfig -> Update IrcBotState ()
setIrcConfig newConfig =
    modify $ \s -> s { ircConfig = newConfig }


$(makeAcidic ''IrcBotState
   [ 'getIrcConfig
   , 'setIrcConfig
   ]
 )