let fold (func: 'acc -> 'data -> 'acc) (acc: 'acc) (stack: 'data stack) : 'acc =
  let rec fold' acc' i =
    if i >= stack.size then
      acc'

    else
      fold' (func acc' stack.stack.(i)) (i + 1)
  in
    fold' acc 0