In hyper_binary, merge the buffers to allow for more efficient merges of small into big filters.
diff --git a/src/hyper.erl b/src/hyper.erl
index a0bb82f..992da1f 100644
--- a/src/hyper.erl
+++ b/src/hyper.erl
@@ -300,7 +300,7 @@
                              [generate_unique(Card), new(P, Mod)]),
              ReusableH = compact(insert_many(generate_unique(Card), new(P, Mod))),
 
-             UnionUs = Time(fun union/2,
+             UnionUs = Time(fun (L, R) -> compact(union(L, R)) end,
                             [insert_many(generate_unique(Card div 10), new(P, Mod)),
                              ReusableH]),
 
diff --git a/src/hyper_binary.erl b/src/hyper_binary.erl
index 6a57e67..a898384 100644
--- a/src/hyper_binary.erl
+++ b/src/hyper_binary.erl
@@ -89,16 +89,18 @@
     Merged = do_merge(SmallB, BigB, <<>>),
     Big#dense{b = Merged};
 
-max_merge(#buffer{buf = Buf}, #dense{b = B} = Dense) ->
-    Merged = merge_buf(B, max_registers(Buf)),
-    Dense#dense{b = Merged};
+max_merge(#buffer{buf = Buf}, #dense{buf = DenseBuf} = Dense) ->
+    Merged = max_registers(DenseBuf ++ Buf),
+    Dense#dense{buf = Merged,
+                buf_size = length(Merged)};
 
-max_merge(#dense{b = B} = Dense, #buffer{buf = Buf}) ->
-    Merged = merge_buf(B, max_registers(Buf)),
-    Dense#dense{b = Merged};
+max_merge(#dense{} = Dense, #buffer{} = Buffer) ->
+    max_merge(Buffer, Dense);
 
 max_merge(#buffer{buf = LeftBuf}, #buffer{buf = RightBuf} = Right) ->
-    Right#buffer{buf = max_registers(LeftBuf ++ RightBuf)}.
+    Merged = max_registers(LeftBuf ++ RightBuf),
+    Right#buffer{buf = Merged,
+                 buf_size = length(Merged)}.