+
+findNextHeader ∷ L.ByteString → (Maybe BlockHeader, L.ByteString)
+findNextHeader src
+ = case L.uncons src of
+ Nothing
+ → (Nothing, L.empty)
+
+ Just (119, src') -- 'w'
+ → let (header, rest) = L.splitAt 32 src
+ in
+ case L.length header ≡ 32 of
+ False
+ → (Nothing, L.empty)
+
+ True
+ → let Just (magicW, header' ) = L.uncons header
+ Just (magicV, header'' ) = L.uncons header'
+ Just (magicP, header''') = L.uncons header''
+ magicK = L.head header'''
+ in
+ if magicW ≡ 119 ∧ magicV ≡ 118 ∧ magicP ≡ 112 ∧ magicK ≡ 107 then
+ -- Found the magic 'wvpk'.
+ let bh = runGet get header
+ in
+ (Just bh, rest)
+ else
+ findNextHeader src'
+
+ Just (_, src')
+ → findNextHeader src'