{-# LANGUAGE   DeriveDataTypeable #-}

module Data.TCache.Defs where
import Data.Typeable
import Control.Concurrent.STM(TVar)

type AccessTime = Integer
type ModifTime  = Integer

data Status a= NotRead | DoNotExist | Exist a deriving Typeable

data Elem a= Elem a AccessTime ModifTime   deriving Typeable

type TPVar a=   TVar (Status(Elem a))

data DBRef a= DBRef String  (TPVar a)  deriving Typeable

castErr a= r where
  r= case cast a of
      Nothing -> error $ "Type error: " ++ (show $ typeOf a) ++ " does not match "++ (show $ typeOf r)
                          ++ "\nThis means that objects of these two types have the same key \nor the retrieved object type is not the stored one for the same key\n"
      Just x  -> x