let array_dim arr =
  match arr.arr_flat with
    | Some f -> object_of f.arr_cell , f.arr_dim - 1
    | None ->
        let rec collect_dim arr n =
          match object_of arr.arr_element with
            | C_array arr -> collect_dim arr (succ n)
            | te -> te,n
        in collect_dim arr 1