[iter] Add hb_unzip()
diff --git a/src/hb-iter.hh b/src/hb-iter.hh
index c3dac6d..05f6457 100644
--- a/src/hb-iter.hh
+++ b/src/hb-iter.hh
@@ -478,6 +478,8 @@
   { return hb_sink_t<Sink&> (*s); }
 } hb_sink HB_UNUSED;
 
+/* hb-drain: hb_sink to void / blackhole / /dev/null. */
+
 static const struct
 {
   template <typename Iter,
@@ -490,6 +492,42 @@
   }
 } hb_drain HB_UNUSED;
 
+/* hb_unzip(): unzip and sink to two sinks. */
+
+template <typename Sink1, typename Sink2>
+struct hb_unzip_t
+{
+  hb_unzip_t (Sink1&& s1, Sink2&& s2) : s1 (s1), s2 (s2) {}
+
+  template <typename Iter,
+	    hb_enable_if (hb_is_iterator (Iter))>
+  void
+  operator () (Iter it) const
+  {
+    for (; it; ++it)
+    {
+      const auto &v = *it;
+      s1 << v.first;
+      s2 << v.second;
+    }
+  }
+
+  private:
+  Sink1 s1;
+  Sink2 s2;
+};
+static const struct
+{
+  template <typename Sink1, typename Sink2> hb_unzip_t<Sink1, Sink2>
+  operator () (Sink1&& s1, Sink2&& s2) const
+  { return hb_unzip_t<Sink1, Sink2> (s1, s2); }
+
+  template <typename Sink1, typename Sink2> hb_unzip_t<Sink1&, Sink2&>
+  operator () (Sink1 *s1, Sink2 *s2) const
+  { return hb_unzip_t<Sink1&, Sink2&> (*s1, *s2); }
+} hb_unzip HB_UNUSED;
+
+
 /* hb-all, hb-any, hb-none. */
 
 static const struct