packages feed

clckwrks-0.13.0: Clckwrks/Menu/Acid.hs

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

import Clckwrks.Menu.Types
import Control.Applicative ((<$>))
import Control.Monad.Reader (ask)
import Control.Monad.State (get, put)
import Control.Monad.Trans (liftIO)
import Data.Acid (AcidState, Query, Update, makeAcidic)
import Data.Data (Data, Typeable)
import Data.IxSet (Indexable, IxSet, (@=), empty, fromList, getOne, ixSet, ixFun, insert, toList, updateIx)
import Data.SafeCopy
import Data.Text (Text)
import Data.Tree (Tree(..))
import qualified Data.Text as Text


data MenuState url  = MenuState 
    { menu      :: Menu url
    }
    deriving (Eq, Read, Show, Data, Typeable)
$(deriveSafeCopy 1 'base ''MenuState)

initialMenuState :: MenuState url
initialMenuState = MenuState { menu = Menu [] }

askMenu :: Query (MenuState url) (Menu url)
askMenu =
    do MenuState{..} <- ask
       return menu

addItem :: MenuItem url -> Update (MenuState url) (Menu url)
addItem item =
    do ms@MenuState{..} <- get
       let menu' = Menu $ (menuItems menu) ++ [Node item []]
       put $ ms { menu = menu' }
       return menu'

setMenu :: Menu url -> Update (MenuState url) ()
setMenu newMenu =
    do ms <- get
       put $ ms { menu = newMenu }

$(makeAcidic ''MenuState ['askMenu, 'addItem, 'setMenu])