mirror of https://github.com/voidlizard/hbs2
intmap writer
This commit is contained in:
parent
93b7164f8c
commit
784ac22b0e
|
@ -63,6 +63,9 @@ import Control.Concurrent
|
||||||
import Data.HashMap.Strict (HashMap)
|
import Data.HashMap.Strict (HashMap)
|
||||||
import Data.HashMap.Strict qualified as HashMap
|
import Data.HashMap.Strict qualified as HashMap
|
||||||
|
|
||||||
|
import Data.IntMap qualified as IntMap
|
||||||
|
import Data.IntMap (IntMap)
|
||||||
|
|
||||||
|
|
||||||
class ( Eq salt
|
class ( Eq salt
|
||||||
, Eq (Hash h)
|
, Eq (Hash h)
|
||||||
|
@ -83,12 +86,12 @@ instance ( Hashable salt
|
||||||
) => ChunkKey salt h
|
) => ChunkKey salt h
|
||||||
|
|
||||||
|
|
||||||
data Chunk h = P [(Offset, ByteString)]
|
data Chunk h = P (IntMap ByteString)
|
||||||
| S (Hash h) ByteString
|
| S (Hash h) ByteString
|
||||||
|
|
||||||
|
|
||||||
instance Hashed h ByteString => Monoid (Chunk h) where
|
instance Hashed h ByteString => Monoid (Chunk h) where
|
||||||
mempty = P []
|
mempty = P mempty
|
||||||
|
|
||||||
instance Hashed h ByteString => Semigroup (Chunk h) where
|
instance Hashed h ByteString => Semigroup (Chunk h) where
|
||||||
(<>) (P a) (P b) = P ( a <> b )
|
(<>) (P a) (P b) = P ( a <> b )
|
||||||
|
@ -111,13 +114,13 @@ instance Hashed h ByteString => Semigroup (Chunk h) where
|
||||||
h3 = hashObject s3
|
h3 = hashObject s3
|
||||||
|
|
||||||
mkP :: Offset -> ByteString -> Chunk h
|
mkP :: Offset -> ByteString -> Chunk h
|
||||||
mkP o b = P [(o,b)]
|
mkP o b = P (IntMap.singleton (fromIntegral o) b)
|
||||||
|
|
||||||
toS :: Hashed h ByteString => Chunk h -> Chunk h
|
toS :: Hashed h ByteString => Chunk h -> Chunk h
|
||||||
toS s@(S{}) = s
|
toS s@(S{}) = s
|
||||||
toS (P xs) = S h s
|
toS (P xs) = S h s
|
||||||
where
|
where
|
||||||
s = foldMap snd $ L.sortBy (compare `on` fst) xs
|
s = mconcat $ IntMap.elems xs
|
||||||
h = hashObject s
|
h = hashObject s
|
||||||
|
|
||||||
data ChunkWriter h m = forall a . ( MonadIO m
|
data ChunkWriter h m = forall a . ( MonadIO m
|
||||||
|
@ -256,11 +259,6 @@ writeChunk2 w salt h o !bs = do
|
||||||
liftIO $ do
|
liftIO $ do
|
||||||
atomically $ modifyTVar cache (HashMap.insertWith (<>) k (mkP o bs) )
|
atomically $ modifyTVar cache (HashMap.insertWith (<>) k (mkP o bs) )
|
||||||
|
|
||||||
flush :: Hashed h ByteString => ChunkWriter h IO -> SKey -> IO ()
|
|
||||||
flush w k = do
|
|
||||||
let cache = perBlock w
|
|
||||||
void $ atomically $ modifyTVar cache (HashMap.adjust toS k)
|
|
||||||
|
|
||||||
getHash2 :: forall salt h m .
|
getHash2 :: forall salt h m .
|
||||||
( ChunkKey salt h
|
( ChunkKey salt h
|
||||||
, Hashed h ByteString
|
, Hashed h ByteString
|
||||||
|
|
Loading…
Reference in New Issue