www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to map elements of a tuple?

reply Andrey <saasecondbox yandex.ru> writes:
Hello,
Is there a template/function/mixin... in the library that I can 
use to map elements of a tuple?

 object.foo(Mapper!myMapFunction(1, bool, "Qwerty", 
 EnumedColor.Red));
where "Mapper" is this mapper and "myMapFunction" is a template function that I want to apply to each member in tuple. I know that there is std.algorithm.map but as I understand it is suitable only for arrays (types are the same).
Aug 22 2018
next sibling parent Alex <sascha.orlov gmail.com> writes:
On Wednesday, 22 August 2018 at 10:36:32 UTC, Andrey wrote:
 Hello,
 Is there a template/function/mixin... in the library that I can 
 use to map elements of a tuple?

 object.foo(Mapper!myMapFunction(1, bool, "Qwerty", 
 EnumedColor.Red));
where "Mapper" is this mapper and "myMapFunction" is a template function that I want to apply to each member in tuple. I know that there is std.algorithm.map but as I understand it is suitable only for arrays (types are the same).
Could you explain, how you mix a type "bool" and a value "Qwerty" in a single tuple? Especially, which value do you pass to you function, when the template parameter becomes bool?
Aug 22 2018
prev sibling parent Simen =?UTF-8?B?S2rDpnLDpXM=?= <simen.kjaras gmail.com> writes:
On Wednesday, 22 August 2018 at 10:36:32 UTC, Andrey wrote:
 Hello,
 Is there a template/function/mixin... in the library that I can 
 use to map elements of a tuple?

 object.foo(Mapper!myMapFunction(1, bool, "Qwerty", 
 EnumedColor.Red));
where "Mapper" is this mapper and "myMapFunction" is a template function that I want to apply to each member in tuple. I know that there is std.algorithm.map but as I understand it is suitable only for arrays (types are the same).
I believe this should be what you're looking for: import std.typecons; auto map(alias fn, T...)(Tuple!T arg) { import std.conv : text; import std.range : iota; import std.algorithm.iteration : joiner, map; return mixin(text("tuple(",T.length.iota.map!(i => text("fn(arg[",i,"])")).joiner(", "),")")); } unittest { import std.conv : to; auto a = tuple(1,2,"").map!(a => a.to!string); assert(a == tuple("1","2","")); } -- Simen
Aug 22 2018