public DirectionalDeltaSource getDirectionalDelta()
 {
  if (empty)
   throw new IllegalStateException("No element(s) have been added to cumulative delta");
  return new DirectionalDeltaSource()
  {
   private DirectionalFragment fragment = forward;
   private int number = 0;
   private int dataAt = 0;

   public boolean nextFragment()
   {
    if (null == fragment)
     return false;
    else
     fragment = fragment.next();
    dataAt = 0;
    if (0L > fragment.offset)
    {
     number = 0;
     fragment = null;
     return false;
    }
    else
    {
     number++;
     return true;
    }
   }
   
   public Delta.Type getType()
   {
    return FORWARD;
   }
   
   public int getFragmentNumber()
   {
    return number;
   }
   
   public int read(byte[] buf, int off, int len)
   {
    if (fragment.data.length <= dataAt)
     return -1;
    else if (fragment.data.length < len + dataAt)
     len = fragment.data.length - dataAt;
    System.arraycopy(fragment.data, dataAt, buf, off, len);
    dataAt += len;
    return len;
   }

   public int skipBytes(int len)
   {
    if (0 > len)
     throw new IllegalArgumentException(Integer.toString(len));
    else if (fragment.data.length < len + dataAt)
     len = fragment.data.length - dataAt;
    dataAt += len;
    return len;
   }
   
   public int read(byte[] buf)
   {
    return read(buf, 0, buf.length);
   }
   
   public long getOffset()
   {
    return fragment.offset;
   }
   
   public int getLength()
   {
    return fragment.data.length;
   }
  };
 }