packages feed

TCache-0.5.5: Sample2.hs

 module Main where
-------------------------------------------------
-- A example of Transactional cache usage (TCache.hs)
-- (Something like the Java Hibernate)
-- Author: Alberto Gómez Corona Nov 2006
-- Language: Haskell
-- Terms of use: you can do whatever you want
-- with this code as long as you keep this notice
------------------------------------------------

import Data.TCache

import Control.Concurrent
import Debug.Trace

debug a b= trace b a

--1 and 4: The data elements to be used in the example

data  Data=   Data Int String
 
              deriving (Read, Show)

--3 The mappings between the cache and the phisical storage are defined by the interface IResource

--      to extract the resource unique key, required

--      to serialize/deserialize it into/from a String, required

--      to define the prefix used for default persistence in files (if prefix have "/", a folder will be created)

-- OPTINONAL:

--      to read the resource from the physical storage, (default provided in file)

--      to store it  (default provided)

--      to delete the resource from the physical storage. (default provided)

 

instance IResource Data where
        keyResource         (Data i _)= show i   
        serialize x= show x
        deserialize x= read x
        defPath _ = "data/"  -- directory where the data is stored.
        
        -- other definable methods: readResource, writeResource delResource. here the default persistence in files are used
        
-- buy is the operation to be performed in the example

--4 withResources gets a partial definition of each resource necessary for extracting the key, 
--fill all the rest of the data structures (if found ) and return a list of Maybe Data. 
--BuyIt is part of the domain problem. it receive this list and generates a new list of 
--data objects that are updated in the cache. buyIt is executed atomically.





main= do
        --asyncronous write every 10 seconds, 100 elems max cache
        clearSyncCacheProc (refcache :: Cache Data) 10 defaultCheck 100 
        
        -- create resources (
        -- (acces no resources and return two new Data objects defined in items)
        withResources[] (\_ ->[Data i "olddata" | i <-[1..200]])
              
        -- after 10 seconds, 200 files  have been created in the folder "data"
        -- because 200 exceeds the maximum cache size (100) defaultCheck will discard 
        -- then 150 first and older elems from cache to reduce it to a half.
        
        
        -- wait 20 seconds 
        
        threadDelay 20000000
        
        
        print "modifyng"
        --update all the list. discarded elems from cache are also updated atomically
        withResources[]  (\_ ->[Data i "newdata" | i <-[1..200]]) 
        --state in disk is also atomically written.
        
       
        
        threadDelay 20000000