///|
fn[T : @btree.BTreeElem] compute_delete_splice(
  ctx : @btree.LeafContext[T],
) -> (@btree.Splice[T], T) {
  if ctx.span == 1 {
    match (ctx.left_neighbor(), ctx.right_neighbor()) {
      (Some(left_elem), Some(right_elem)) =>
        if @rle.Mergeable::can_merge(left_elem, right_elem) {
          let merged = @rle.Mergeable::merge(left_elem, right_elem)
          return (
            {
              start_idx: ctx.child_idx - 1,
              end_idx: ctx.child_idx + 2,
              new_leaves: [(merged, @rle.Spanning::span(merged))],
            },
            ctx.elem,
          )
        }
      _ => ()
    }
    return (
      { start_idx: ctx.child_idx, end_idx: ctx.child_idx + 1, new_leaves: [] },
      ctx.elem,
    )
  }
  if ctx.offset == 0 {
    let deleted = must_slice(ctx.elem, start=0, end=1)
    let rest = must_slice(ctx.elem, start=1, end=ctx.span)
    match ctx.left_neighbor() {
      Some(left_elem) =>
        if @rle.Mergeable::can_merge(left_elem, rest) {
          let merged = @rle.Mergeable::merge(left_elem, rest)
          return (
            {
              start_idx: ctx.child_idx - 1,
              end_idx: ctx.child_idx + 1,
              new_leaves: [(merged, @rle.Spanning::span(merged))],
            },
            deleted,
          )
        }
      None => ()
    }
    return (
      {
        start_idx: ctx.child_idx,
        end_idx: ctx.child_idx + 1,
        new_leaves: [(rest, @rle.Spanning::span(rest))],
      },
      deleted,
    )
  }
  if ctx.offset == ctx.span - 1 {
    let deleted = must_slice(ctx.elem, start=ctx.span - 1, end=ctx.span)
    let rest = must_slice(ctx.elem, start=0, end=ctx.span - 1)
    match ctx.right_neighbor() {
      Some(right_elem) =>
        if @rle.Mergeable::can_merge(rest, right_elem) {
          let merged = @rle.Mergeable::merge(rest, right_elem)
          return (
            {
              start_idx: ctx.child_idx,
              end_idx: ctx.child_idx + 2,
              new_leaves: [(merged, @rle.Spanning::span(merged))],
            },
            deleted,
          )
        }
      None => ()
    }
    return (
      {
        start_idx: ctx.child_idx,
        end_idx: ctx.child_idx + 1,
        new_leaves: [(rest, @rle.Spanning::span(rest))],
      },
      deleted,
    )
  }

  let deleted = must_slice(ctx.elem, start=ctx.offset, end=ctx.offset + 1)
  let left_part = must_slice(ctx.elem, start=0, end=ctx.offset)
  let right_part = must_slice(ctx.elem, start=ctx.offset + 1, end=ctx.span)
  if @rle.Mergeable::can_merge(left_part, right_part) {
    let merged = @rle.Mergeable::merge(left_part, right_part)
    return (
      {
        start_idx: ctx.child_idx,
        end_idx: ctx.child_idx + 1,
        new_leaves: [(merged, @rle.Spanning::span(merged))],
      },
      deleted,
    )
  }
  (
    {
      start_idx: ctx.child_idx,
      end_idx: ctx.child_idx + 1,
      new_leaves: [
        (left_part, @rle.Spanning::span(left_part)),
        (right_part, @rle.Spanning::span(right_part)),
      ],
    },
    deleted,
  )
}