///|
pub(all) struct StackAdjustStep {
  amount : Int
  probe_after : Bool
} derive(Debug, Eq)

///|
pub fn plan_stack_pointer_adjustment(
  amount : Int,
  page_size? : Int = 4096,
) -> Array[StackAdjustStep] {
  let steps : Array[StackAdjustStep] = []
  if amount == 0 {
    return steps
  }
  let (abs_amount, is_sub) = if amount < 0 {
    (-amount, true)
  } else {
    (amount, false)
  }
  if is_sub && abs_amount < page_size {
    steps.push({ amount, probe_after: false })
    return steps
  }
  let mut remaining = abs_amount
  while remaining >= page_size {
    steps.push({
      amount: if is_sub {
        -page_size
      } else {
        page_size
      },
      probe_after: is_sub,
    })
    remaining = remaining - page_size
  }
  if remaining > 0 {
    steps.push({
      amount: if is_sub {
        -remaining
      } else {
        remaining
      },
      probe_after: is_sub,
    })
  }
  steps
}