module Data.BTree.Types where
import Data.Hashable (Hashable)
import Data.BTree.Cache.Class
import Data.Word
import Data.Serialize
import Data.Map as M
import Data.Hashable
import Control.Concurrent.STM
import Control.Monad.Reader
import System.Random
newtype Ref a = Ref Word64
deriving (Show, Ord, Eq, Hashable, Num)
instance Serialize (Ref a) where
put (Ref a) = put a
get = Ref `fmap` get
data Node k v = Leaf (M.Map k v)
| Branch [k] [Ref (Node k v)]
deriving Eq
instance (Ord k, Serialize k, Serialize v) => Serialize (Node k v) where
put (Leaf ks) =
do put (0 :: Word8)
put ks
put (Branch ks rs) =
do put (1 :: Word8)
put ks
put rs
get = do tag <- get :: Get Word8
case tag of
0 -> Leaf `fmap` get
1 -> do ks <- get
rs <- get
return $ Branch ks rs
data Param st k v = Param {
order :: Int
, root :: TVar (Ref (Node k v))
, state :: st
, marked :: TChan k
, unused :: TVar [Ref (Node k v)]
}
newtype BTreeM m st k v a = BTreeM { runBTreeM :: ReaderT (Param st k v) m a }
deriving (Monad, MonadIO, MonadReader (Param st k v), Functor)