acid-state-0.6.0: examples/Proxy.hs
{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeFamilies #-}
module Main (main) where
import Data.Acid
import Data.Acid.Remote
import Data.Acid.Advanced ( scheduleUpdate )
import Control.Monad.State
import Control.Monad.Reader
import System.Environment
import System.IO
import Network
import Data.SafeCopy
import Data.Typeable
------------------------------------------------------
-- The Haskell structure that we want to encapsulate
data ProxyStressState = StressState !Int
deriving (Typeable)
$(deriveSafeCopy 0 'base ''ProxyStressState)
------------------------------------------------------
-- The transaction we will execute over the state.
pokeState :: Update ProxyStressState ()
pokeState = do StressState i <- get
put (StressState (i+1))
queryState :: Query ProxyStressState Int
queryState = do StressState i <- ask
return i
clearState :: Update ProxyStressState ()
clearState = put $ StressState 0
$(makeAcidic ''ProxyStressState ['pokeState, 'queryState, 'clearState])
openLocal :: IO (AcidState ProxyStressState)
openLocal = openLocalState (StressState 0)
openRemote :: String -> IO (AcidState ProxyStressState)
openRemote socket = openRemoteState "localhost" (UnixSocket socket)
main :: IO ()
main = do args <- getArgs
case args of
["server", socket]
-> do acid <- openLocal
acidServer acid (UnixSocket socket)
["proxy", from, to]
-> do acid <- openRemote from
acidServer acid (UnixSocket to)
["query", socket]
-> do acid <- openRemote socket
n <- query acid QueryState
putStrLn $ "State value: " ++ show n
["poke", socket]
-> do acid <- openRemote socket
putStr "Issuing 100k transactions... "
hFlush stdout
replicateM_ (100000-1) (scheduleUpdate acid PokeState)
update acid PokeState
putStrLn "Done"
["clear", socket]
-> do acid <- openRemote socket
update acid ClearState
createCheckpoint acid
["checkpoint", socket]
-> do acid <- openRemote socket
createCheckpoint acid
_ -> do putStrLn $ "Commands:"
putStrLn $ " server socket Start a new server instance."
putStrLn $ " proxy from to Pipe events between 'from' and 'to'."
putStrLn $ " query socket Prints out the current state."
putStrLn $ " poke socket Spawn 100k transactions."
putStrLn $ " clear socket Reset the state and write a checkpoint."
putStrLn $ " checkpoint socket Create a new checkpoint."