mirror of https://github.com/voidlizard/hbs2
35 lines
1.0 KiB
Haskell
35 lines
1.0 KiB
Haskell
module HBS2.Tests.MapStore where
|
|
|
|
import Control.Monad.State as State
|
|
import Data.ByteString.Lazy (ByteString)
|
|
import Data.Functor.Identity
|
|
import Data.Map (Map)
|
|
import Data.Map qualified as Map
|
|
|
|
import HBS2.Hash
|
|
|
|
type MapStore = Map (Hash HbSync) ByteString
|
|
type MapStoreM a = MapStoreT Identity a
|
|
newtype MapStoreT m a = MapStoreT {unMapStoreT :: StateT MapStore m a}
|
|
deriving newtype (Functor, Applicative, Monad, MonadTrans, MonadState MapStore)
|
|
|
|
runMapStoreM :: MapStoreM a -> a
|
|
runMapStoreM = runIdentity . runMapStoreT
|
|
|
|
runMapStoreT :: (Monad m) => MapStoreT m a -> m a
|
|
runMapStoreT = flip evalStateT mempty . unMapStoreT
|
|
|
|
mapStorePutBlock :: (Monad m) => ByteString -> MapStoreT m (Hash HbSync)
|
|
mapStorePutBlock bs =
|
|
h <$ State.modify (Map.insert h bs)
|
|
where
|
|
h = hashObject bs
|
|
|
|
mapStoreReadBlock :: (Monad m) => (Hash HbSync) -> MapStoreT m (Maybe ByteString)
|
|
mapStoreReadBlock h =
|
|
State.gets (Map.lookup h)
|
|
|
|
mapStoreDeleteBlock :: (Monad m) => (Hash HbSync) -> MapStoreT m ()
|
|
mapStoreDeleteBlock h =
|
|
State.modify (Map.delete h)
|