function intercalate (callable $fn)
  {
    return $this->map (function ($v, &$k) use ($fn) {
      $r = $fn ($v, $k);
      if (is_iterable ($r))
        return new HeadAndTailIterator ($v, $r, $k, true);
      return $r;
    })->unfold ();
  }