packages feed

infinity-0.3: PState.hs

module PState (
  putState,
  getState,
  updateState
) where
import System.IO
import Data.Maybe
import Data.Binary
import Control.Monad
import System.FilePath
import System.Directory

putState :: Binary a => String -> String -> a -> IO (Maybe String)
putState n k v = do
  let file  = foldr1 combine ["State",n,(k++".st")]
      dir   = takeDirectory file
  b <- doesFileExist file
  if b then
      return (Just $ "State already exists: " ++ file)
   else do
       unlessM (doesDirectoryExist dir) (createDirectory dir)
       encodeFile file v
       return Nothing

getState :: Binary a => String -> String -> IO (Either String a)
getState n k = do
  let file = foldr1 combine ["State",n,(k++".st")]
  b <- doesFileExist file
  if b == False then
      return $ Left ("State doesn't exist: " ++ file)
   else decodeFile file >>= return . Right


updateState :: Binary a => String -> String -> a -> IO (Maybe String)
updateState n k v = do
  let file = foldr1 combine ["State",n,(k++".st")]
  b <- doesFileExist file
  if b == False then
      return (Just $ "State doesn't exist: " ++ file)
   else encodeFile file v >> return Nothing

-- convenience
create f = (openFile f WriteMode) >>= hClose
unlessM b f = b >>= \x -> unless x f