# Copyright 2023 Lary Gibaud
# SPDX-License-Identifier: GPL-3.0-or-later
import re


def arm_big_little_first_group_ncpus() -> int | None:
    """
    Infer from /proc/cpuinfo on aarch64 if this is a big/little architecture
    (if there is different processor models) and the number of cores in the
    first model group.
    https://en.wikipedia.org/wiki/ARM_big.LITTLE

    :returns: the number of cores of the first model in the order given by
              linux or None if not big/little architecture
    """
    pattern = re.compile(r"^CPU part\s*: (\w+)$")
    counter = 0
    part = None

    with open("/proc/cpuinfo") as cpuinfo:
        for line in cpuinfo:
            match = pattern.match(line)
            if match:
                grp = match.group(1)
                if not part:
                    part = grp
                    counter += 1
                elif part == grp:
                    counter += 1
                else:
                    return counter
        return None
