about summary refs log tree commit diff
path: root/third_party/bazel/rules_haskell/haskell/private/list.bzl
blob: 14ffd5f06876cd4d8e0f3054aa78f9e4f0942b1b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
"""Helper functions on lists."""

load(":private/set.bzl", "set")

def _dedup_on(f, list_):
    """deduplicate `list_` by comparing the result of applying
    f to each element (e.g. comparing sub fields)

    def compare_x(el):
      return el.x

    dedup_on([struct(x=3), struct(x=4), struct(x=3)], compare_x)
    => [struct(x=3), struct(x=4)]
    """
    seen = set.empty()
    deduped = []
    for el in list_:
        by = f(el)
        if not set.is_member(seen, by):
            set.mutable_insert(seen, by)
            deduped.append(el)
    return deduped

list = struct(
    dedup_on = _dedup_on,
)