packages feed

acid-state-dist-0.1.0.1: examples/IntCommon.hs

{-# LANGUAGE DeriveDataTypeable, TemplateHaskell, TypeFamilies #-}

module IntCommon where

import Data.Acid
import Data.SafeCopy
import Data.Typeable

import Control.Monad.Reader (ask)
import Control.Monad.State (put, get)


-- encapsulate some integers

data IntState = IntState Int
    deriving (Show, Typeable)

$(deriveSafeCopy 0 'base ''IntState)

-- transactions

setState :: Int -> Update IntState ()
setState value = put (IntState value)

setStateEven :: Int -> Update IntState Bool
setStateEven value = if even value
    then put (IntState value) >> return True
    else return False

getState :: Query IntState Int
getState = do
    IntState val <- ask
    return val

incrementState :: Update IntState ()
incrementState = do
    IntState val <- get
    put (IntState (val + 1))

$(makeAcidic ''IntState ['setState, 'setStateEven, 'getState, 'incrementState])