TCache-0.9.0.4: demos/caching.hs
{-# LANGUAGE DeriveDataTypeable #-}
module Main where
-------------------------------------------------
-- TCache example
-- it ilustrates the use of clearSyncCacheProc while the data is being updated
------------------------------------------------
import Data.TCache
import Data.TCache.DefaultPersistence
import Data.ByteString.Lazy.Char8(pack,unpack)
import Control.Concurrent
import Debug.Trace
import Data.Typeable
debug a b= trace b a
-- The data elements to be used in the example
data Data= Data Int Int deriving (Read, Show, Typeable)
instance Indexable Data where
key (Data i _)= show i
defPath _ = "cacheData/" -- directory where the data is stored.
instance Serializable Data where
serialize= pack . show
deserialize= read . unpack
main= do
putStrLn "see the source code of this example"
putStrLn "This program test the caching and cleaning and re-retrieval and update of the cache"
putStrLn "asyncronous write every 10 seconds, 100 elems max cache size"
putStrLn "default policy (defaultCheck) for clearing the cache is to reduce the cache to half of max sixe when size exceeds the max"
putStrLn ""
putStrLn "create resources"
putStrLn " (acces no resources and return two new Data objects defined in items)"
withResources[] $ const[Data i 0 | i <- [1..200]]
putStrLn ""
clearSyncCacheProc 10 defaultCheck 100
putStrLn $ "every 10 seconds, the modified data in the cache is written in the folder: " ++ defPath ( undefined :: Data)
putStrLn "wait 10 seconds to let the next write cycle to enter (every 10 seconds, set by clearSyncCacheProc)"
putStrLn "because 200 exceeds the maximum cache size (100) defaultCheck will discard the 150 older elems to reduce the cache to a half"
putStrLn "This is the behaviour defined in defaultCheck."
threadDelay 20000000
putStrLn " update every element, included the discarded ones"
withResources [Data i undefined | i <- [1..200]] $
\ds -> [ Data i (n+1) | Just(Data i n) <- ds]
putStrLn $"wait for the next cycle of file update. The files must contain 1 instead o 0 (Data n 1) in the folder "++ defPath ( undefined :: Data)
threadDelay 20000000