aboutsummaryrefslogtreecommitdiff
path: root/uploader/datautils.py
blob: b95a9e0c081b3d2fc36844aaa0830add7d1304af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"""Generic data utilities: Rename module."""
import math
from functools import reduce

def order_by_family(items: tuple[dict, ...],
                    family_key: str = "Family",
                    order_key: str = "FamilyOrderId") -> list:
    """Order the populations by their families."""
    def __family_order__(item):
        orderval = item[order_key]
        return math.inf if orderval is None else orderval

    def __order__(ordered, current):
        _key = (__family_order__(current), current[family_key])
        return {
            **ordered,
            _key: ordered.get(_key, tuple()) + (current,)
        }

    return sorted(tuple(reduce(__order__, items, {}).items()),
                  key=lambda item: item[0][0])