# BSD 3-Clause License; see https://github.com/scikit-hep/awkward-1.0/blob/main/LICENSE

from __future__ import absolute_import

import awkward as ak

np = ak.nplike.NumpyMetadata.instance()


def num(array, axis=1, highlevel=True, behavior=None):
    raise NotImplementedError


#     """
#     Args:
#         array: Data containing nested lists to count.
#         axis (int): The dimension at which this operation is applied. The
#             outermost dimension is `0`, followed by `1`, etc., and negative
#             values count backward from the innermost: `-1` is the innermost
#             dimension, `-2` is the next level up, etc.
#         highlevel (bool): If True, return an #ak.Array; otherwise, return
#             a low-level #ak.layout.Content subclass.
#         behavior (None or dict): Custom #ak.behavior for the output array, if
#             high-level.

#     Returns an array of integers specifying the number of elements at a
#     particular level.

#     For instance, given the following doubly nested `array`,

#         ak.Array([[
#                    [1.1, 2.2, 3.3],
#                    [],
#                    [4.4, 5.5],
#                    [6.6]
#                   ],
#                   [],
#                   [
#                    [7.7],
#                    [8.8, 9.9]]
#                   ])

#     The number of elements in `axis=1` is

#         >>> ak.num(array, axis=1)
#         <Array [4, 0, 2] type='3 * int64'>

#     and the number of elements at the next level down, `axis=2`, is

#         >>> ak.num(array, axis=2)
#         <Array [[3, 0, 2, 1], [], [1, 2]] type='3 * var * int64'>

#     The `axis=0` case is special: it returns a scalar, the length of the array.

#         >>> ak.num(array, axis=0)
#         3

#     This function is useful for ensuring that slices do not raise errors. For
#     instance, suppose that we want to select the first element from each
#     of the outermost nested lists of `array`. One of these lists is empty, so
#     selecting the first element (`0`) would raise an error. However, if our
#     first selection is `ak.num(array) > 0`, we are left with only those lists
#     that *do* have a first element:

#         >>> array[ak.num(array) > 0, 0]
#         <Array [[1.1, 2.2, 3.3], [7.7]] type='2 * var * float64'>

#     To keep a placeholder (None) in each place we do not want to select,
#     consider using #ak.mask instead of a #ak.Array.__getitem__.

#         >>> ak.mask(array, ak.num(array) > 0)[:, 0]
#         <Array [[1.1, 2.2, 3.3], None, [7.7]] type='3 * option[var * float64]'>
#     """
#     layout = ak._v2.operations.convert.to_layout(
#         array, allow_record=False, allow_other=False
#     )
#     out = layout.num(axis=axis)
#     return ak._v2._util.maybe_wrap_like(out, array, behavior, highlevel)
