pruneAA

Iterates an associative array and deletes invalid entries, either if the value is in a default .init state or as per the optionally passed predicate.

It is undefined behaviour to remove keys from an associative array when foreaching through it. Use this as a separate pass to safely remove entries.

void
pruneAA
(
alias pred = null
AA : V[K]
V
K
)
(
ref AA aa
)
if (
isMutable!AA
)

Parameters

pred

Optional unary or binary predicate if special logic is needed to determine whether an entry is to be removed or not.

aa AA

Reference to the associative array to modify.

Examples

auto aa =
[
    "abc" : "def",
    "ghi" : string.init;
    "mno" : "123",
    "pqr" : string.init,
];

pruneAA(aa);

assert("ghi" !in aa);
assert("pqr" !in aa);

pruneAA!((entry) => entry.length > 0)(aa);

assert("abc" !in aa);
assert("mno" !in aa);
1 import std.conv : text;
2 
3 {
4     auto aa =
5     [
6         "abc" : "def",
7         "ghi" : "jkl",
8         "mno" : "123",
9         "pqr" : string.init,
10     ];
11 
12     pruneAA!((a) => a == "def")(aa);
13     assert("abc" !in aa);
14 
15     pruneAA!((a,b) => a == "pqr")(aa);
16     assert("pqr" !in aa);
17 
18     pruneAA!`a == "123"`(aa);
19     assert("mno" !in aa);
20 }
21 {
22     struct Record
23     {
24         string name;
25         int id;
26     }
27 
28     auto aa =
29     [
30         "rhubarb"   : Record("rhubarb", 100),
31         "raspberry" : Record("raspberry", 80),
32         "blueberry" : Record("blueberry", 0),
33         "apples"    : Record("green apples", 60),
34         "yakisoba"  : Record("yakisoba", 78),
35         "cabbage"   : Record.init,
36     ];
37 
38     pruneAA(aa);
39     assert("cabbage" !in aa);
40 
41     pruneAA!((entry) => entry.id < 80)(aa);
42     assert("blueberry" !in aa);
43     assert("apples" !in aa);
44     assert("yakisoba" !in aa);
45     assert((aa.length == 2), aa.length.text);
46 }
47 {
48     import std.algorithm.searching : canFind;
49 
50     string[][string] aa =
51     [
52         "abc" : [ "a", "b", "c" ],
53         "def" : [ "d", "e", "f" ],
54         "ghi" : [ "g", "h", "i" ],
55         "jkl" : [ "j", "k", "l" ],
56     ];
57 
58     pruneAA(aa);
59     assert((aa.length == 4), aa.length.text);
60 
61     pruneAA!((entry) => entry.canFind("a"))(aa);
62     assert("abc" !in aa);
63 }
64 {
65     auto aa =
66     [
67         "rhubarb"   : 500,
68         "raspberry" : 500,
69         "blueberry" : 499,
70         "apples"    : 900,
71         "yakisoba"  : 499,
72         "cabbage"   : 999,
73     ];
74 
75     pruneAA!((key, val) => (key[0] == 'r') || (val < 500))(aa);
76     assert("rhubarb" !in aa);
77     assert("raspberry" !in aa);
78     assert("blueberry" !in aa);
79     assert("apples" in aa);
80     assert("yakisoba" !in aa);
81     assert("cabbage" in aa);
82 
83     pruneAA!`a[0] == 'c'`(aa);
84     assert("cabbage" !in aa);
85 }
86 {
87     auto aa =
88     [
89         123 : 456,
90         789 : 123,
91         111 : 222,
92         333 : 444,
93         555 : 666,
94     ];
95 
96     pruneAA!(val => val < 300)(aa);
97     assert(123  in aa);
98     assert(789 !in aa);
99     assert(111 !in aa);
100     assert(333  in aa);
101     assert(555  in aa);
102 
103     pruneAA!`b > 400`(aa);
104     assert(555 !in aa);
105 }