code: func (h *fragHeap) reassemble() (buffer.VectorisedView, error) {
  	curr := heap.Pop(h).(fragment)
  	views := curr.vv.Views()
  	size := curr.vv.Size()
  
  	if curr.offset != 0 {
  		return buffer.VectorisedView{}, fmt.Errorf("offset of the first packet is != 0 (%d)", curr.offset)
  	}
  
  	for h.Len() > 0 {
  		curr := heap.Pop(h).(fragment)
  		if int(curr.offset) < size {
  			curr.vv.TrimFront(size - int(curr.offset))
  		} else if int(curr.offset) > size {
  			return buffer.VectorisedView{}, fmt.Errorf("packet has a hole, expected offset %d, got %d", size, curr.offset)
  		}
  		size += curr.vv.Size()
  		views = append(views, curr.vv.Views()...)
  	}
  	return buffer.NewVectorisedView(size, views), nil
  }
docs: // reassamble empties the heap and returns a VectorisedView
  // containing a reassambled version of the fragments inside the heap.