module Sample
where
import Control.Monad( when )
import Data.TStorage
import Data.TMap
import Data.TMap.Backend.StdoutBackend
import qualified Data.CacheStructure.LRU as C
import Control.Concurrent.AdvSTM 
import qualified Control.Exception as Exc
import qualified Data.Edison.Assoc.StandardMap as M
import Prelude hiding( lookup )

data Sometype = Sometype { theid :: Int, name :: String }
                deriving (Show,Eq,Ord)

instance HasKey Sometype Int where
  key = theid

sample :: IO ()
sample = Exc.handle (\(e::Exc.SomeException) -> print e) $ do
  tmap <- newTMapIO newStdoutBackend (Just 4) 
            :: IO (TMap (M.FM Int) Int Sometype StdoutBackend C.LRU)
  -- First the low level TMap interface:
  res  <- atomically $ do
    insert 1 (Sometype 1 "somename")  tmap
    insert 2 (Sometype 2 "somename2") tmap
    insert 3 (Sometype 3 "somename3") tmap
    insert 4 (Sometype 4 "somename4") tmap
    insert 5 (Sometype 5 "somename5") tmap
    insert 6 (Sometype 6 "somename6") tmap
    lookup 2 tmap
    delete 2 tmap
    lookup 2 tmap
  atomically $ purgeTMap tmap
  print ("Result1: ",res) 

  -- Let's try the high-level TStorage interface:
  res2 <- atomically $ do
    add (Sometype 7 "somename7") tmap
    v1 <- apply (\s -> s{name="_"}) (Sometype {theid = 4}) tmap
    v2 <- complete (Sometype {theid = 5}) tmap
    return (v1,v2)
  print ("Result2: ",res2)

test :: IO ()
test = do
   tmap <- newTMapIO newStdoutBackend (Just 4) 
            :: IO (TMap (M.FM Int) Int String StdoutBackend C.LRU)
   atomically $ do
       isMemb <- member 1 tmap
       when (not isMemb) $ 
         insert 1 "john doe" tmap
  
   atomically $ do
     v <- lookup 1 tmap
     -- ... doing something here with 'v'
     adjust (\_ -> "jd") 1 tmap