ad6feb3261e0303ce1b1996b33cc6bd25a2425ef
[acid-state-dist.git] / examples / HelloWorldSlave_Safe.hs
1 {-# LANGUAGE DeriveDataTypeable #-}
2 {-# LANGUAGE TemplateHaskell    #-}
3 {-# LANGUAGE TypeFamilies       #-}
4
5 import Control.Monad.Reader
6 import Control.Monad.State
7 import Data.Acid
8 import Data.Acid.Centered
9 import Data.SafeCopy
10 import Data.Typeable
11 import Control.Exception
12
13 ------------------------------------------------------
14 -- The Haskell structure that we want to encapsulate
15
16 data HelloWorldState = HelloWorldState String
17     deriving (Show, Typeable)
18
19 $(deriveSafeCopy 0 'base ''HelloWorldState)
20
21 ------------------------------------------------------
22 -- The transaction we will execute over the state.
23
24 writeState :: String -> Update HelloWorldState ()
25 writeState newValue
26     = put (HelloWorldState newValue)
27
28 queryState :: Query HelloWorldState String
29 queryState = do HelloWorldState string <- ask
30                 return string
31
32 $(makeAcidic ''HelloWorldState ['writeState, 'queryState])
33
34 main :: IO ()
35 main = bracket
36     (enslaveState "localhost"  3333 (HelloWorldState "Hello world"))
37     (\acid -> putStrLn "Finally shutting down Slave." >> closeAcidState acid)
38     $ \acid -> do
39         putStrLn "Possible commands: x for exit; q for query; uString for update;"
40         let loop = do
41               input <- getLine
42               case input of
43                   ('x':_) ->
44                       putStrLn "Bye!"
45                   ('q':_) -> do
46                       string <- query acid QueryState
47                       putStrLn $ "The state is: " ++ string
48                       loop
49                   ('u':str) -> do
50                       update acid (WriteState str)
51                       putStrLn "The state has been modified!"
52                       loop
53                   _ -> do
54                       putStrLn $ "Unknown command " ++ input
55                       loop
56         loop