diff --git a/hwsl2.cabal b/hwsl2.cabal
--- a/hwsl2.cabal
+++ b/hwsl2.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.3.1.1
+version:             0.3.2.0
 
 -- A short (one-line) description of the package.
 synopsis:            Hashing with SL2
@@ -73,6 +73,7 @@
 library
   -- Modules exported by the library.
   exposed-modules:     Data.Hash.SL2
+                       Data.Hash.SL2.Chunk
                        Data.Hash.SL2.Mutable
                        Data.Hash.SL2.Unsafe
 
diff --git a/src/Data/Hash/SL2/Chunk.hs b/src/Data/Hash/SL2/Chunk.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Hash/SL2/Chunk.hs
@@ -0,0 +1,24 @@
+module Data.Hash.SL2.Chunk where
+
+import Data.ByteString
+import Data.Hash.SL2
+import Data.Monoid
+
+data Chunk = Chunk
+  { getChunkHash :: Hash
+  , getChunkBytes :: ByteString
+  }
+
+instance Eq Chunk where
+  a == b = getChunkHash a == getChunkHash b
+
+instance Ord Chunk where
+  compare a b = compare (getChunkHash a) (getChunkHash b)
+
+instance Monoid Chunk where
+  mempty = Chunk mempty mempty
+  mappend a b = Chunk (getChunkHash a <> getChunkHash b) (getChunkBytes a <> getChunkBytes b)
+  mconcat as = Chunk (mconcat $ fmap getChunkHash as) (mconcat $ fmap getChunkBytes as)
+
+fromByteString :: ByteString -> Chunk
+fromByteString b = Chunk (hash b) b
