1 // https://issues.dlang.org/show_bug.cgi?id=23174
3 alias AliasSeq(T
...) = T
;
5 template staticMap(alias fun
, args
...)
7 alias staticMap
= AliasSeq
!();
8 static foreach(arg
; args
)
9 staticMap
= AliasSeq
!(staticMap
, fun
!arg
);
12 template Filter(alias pred
, args
...)
14 alias Filter
= AliasSeq
!();
15 static foreach (arg
; args
)
17 Filter
= AliasSeq
!(Filter
, arg
);
22 private static alias toField(alias e
) = Field
!(__traits(identifier
, e
));
23 alias fields
= staticMap
!(toField
, T
.tupleof
);
25 static alias map(alias F
) = staticMap
!(F
, fields
);
26 static alias filter(alias pred
) = Filter
!(pred
, fields
);
29 struct Field(string n
)
43 enum toName(alias e
) = e
.name
;
44 enum pred(alias e
) = true;
46 alias a
= Fields
!(Foo
).filter
!(pred
); // works
47 static assert(is(a
== AliasSeq
!(Field
!"a")));
49 alias b
= Fields
!(Foo
).map
!(toName
); // works
50 static assert(b
== AliasSeq
!("a"));
52 alias c
= Fields
!(Foo
).init
.filter
!(pred
); // works
53 static assert(is(c
== AliasSeq
!(Field
!"a")));
55 // OK <- Error: alias `d` cannot alias an expression `Fields().tuple("a")`
56 alias d
= Fields
!(Foo
).init
.map
!(toName
);
57 static assert(d
== AliasSeq
!("a"));