sliceStruct = (left, diff) => {
  if (left.constructor === GC) {
    const {
      client,
      clock
    } = left.id;
    return new GC(createID(client, clock + diff), left.length - diff);
  } else if (left.constructor === Skip) {
    const {
      client,
      clock
    } = left.id;
    return new Skip(createID(client, clock + diff), left.length - diff);
  } else {
    const leftItem =
    /** @type {Item} */
    left;
    const {
      client,
      clock
    } = leftItem.id;
    return new Item(createID(client, clock + diff), null, createID(client, clock + diff - 1), null, leftItem.rightOrigin, leftItem.parent, leftItem.parentSub, leftItem.content.splice(diff));
  }
}
This method is intended to slice any kind of struct and retrieve the right part.
It does not handle side-effects, so it should only be used by the lazy-encoder.

@param {Item | GC | Skip} left
@param {number} diff
@return {Item | GC}